1.静态数据成员的定义。静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。其定义方式与全局变量相同。
与全局变量相比,使用静态数据成员的优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。(静态数据成员属于本类的所有对象共享)。
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。
3.静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
//结果为1,2;可见派生类与基类共用一个静态数据成员。
4.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
classbase{public:staticint_staticVar;int_var;voidfoo1(inti=_staticVar);//正确,_staticVar为静态数据成员voidfoo2(inti=_var);//错误,_var为普通数据成员};
classbase{public:staticbase_object1;//正确,静态数据成员base_object2;//错误base*pObject;//正确,指针base&mObject;//正确,引用};
6.★静态数据成员的值在const成员函数中可以被合法的改变。举例如下:
1classbase{2public:3base(){_i=0;_val=0;}45mutableint_i;//类数据成员加上mutable后,修饰为const的成员函数就可以修改它6staticint_staticVal;7int_val;8voidtest()const{//const成员函数910_i++;//正确,mutable数据成员11_staticVal++;//正确,static数据成员12_val++;//错误13}14};
静态成员函数:
1.静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是因为静态成员函数不含this指针。
2.静态成员函数是类的成员函数,该函数不属于该类申请的任何一个对象,而是所有该类成员共同共有的一个函数。
为什么static变量只初始化一次?
对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后一直没有被销毁,都会保存在内存区域汇总,所以不会再次初始化。