下面用一个简单的程序加以理解
- #include <iostream>
- #include <string>
- using namespace std;
- class Test
- {
- public:
- static int j;
- static void init();//init定义为static 或非static都可以修改static成员i的值
- static int revise_i(int x);
- int get_i();
- //由于没有this指针,static成员函数不能反问对象的非static成员,用static输出k是非法的
- private:
- static int i;
- int k;
- const static int r = 1; //只有const static 成员在类定义时初始化
- //若将上面的i直接初始化,编译时报错
- };
- //外部定义时不能再标示static
- int Test::i=0; //very important:外部定义(正好一次),之后i只能通过init修改
- int Test::j=5; //j为public,之后可以直接访问和修改
- void Test::init()
- {
- i=10;
- }
- int Test::get_i()
- {
- return i;
- }
- int Test::revise_i(int x)
- {
- i = x;
- return i;
- }
- int main()
- {
- Test obj;
- cout << obj.get_i() << endl; //通过
- obj.init(); //私有的静态成员只能通过类的静态成员函数进行修改
- cout << obj.get_i() << endl;
- cout << Test::j << endl;
- obj.j = 15; //公有的静态成员可以直接进行修改,访问方式可以obj.j或者Test::j
- Test::revise_i(555);
- cout << "after revise_i, i = " << obj.get_i() << endl;
- cout << Test::j << endl;
- system("pause");
- return 0;
- }
static成员函数不可以声明为const的原因:
这是C++的规则 const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall 而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰。