static
静态数据成员,用关键字static声明,该类的所有对象维护该成员的同一个拷贝(包括该类派生类的对象,即派生类对象与基类对象共享基类的静态数据成员。
1、 Static数据成员必须在类外部定义,且正好定义一次,static成员属于类,在类定义时初始化,而不是像普通数据成员在对象建立时通过构造函数初始化。用(::)来指明所属的类 。
2、在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某个地方使用类名限定进行定义性说明,这时也可初始化。
(延伸:C++头文件可以用const int a = 4;或者 static int a = 4;因为const声明变量在本文件是局部变量,只在本文件有效。而静态变量也是声明该变量只在本文件有效,所以包含这个头文件的多个源文件里面都有多个a变量,名字和值都相同。如果是单纯的int a,则需要在头文件里面用extern int a; 而且a不能赋值。)
3、静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为所属类类型的指针或引用
1 classbase{
2 public :
3 static base _object1;//正确,静态数据成员
4 base _object2;//错误
5 base *pObject;//正确,指针
6 base &mObject;//正确,引用
7 };
4、静态数据成员的值在const成员函数中可以被合法的改变(const函数只能禁止该对象值,却不能禁止该类的成员值)。举例如下:
1 class base{
2 public:
3 base(){_i=0;_val=0;}
4 mutable int _i;
5 static int _staticVal;
6 int _val;
7 void test() const{//const 成员函数
8 _i++;//正确,mutable数据成员
9 _staticVal++;//正确,static数据成员
10 _val++;//错误
11 }
12 };
13
5、静态数据成员可以成为成员函数的默认参数,而普通数据成员则不可以。举例如下:
1 class base{
2 public :
3 static int _staticVar;
4 int _var;
5 void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
6 void foo2(int i=_var);//错误,_var为普通数据成员
7 };
6、一般数据成员只能在对象初始化时初始化,static成员在类定义时体外部初始化,而const static数据成员可以在类内部初始化
静态成员函数,在成员函数前面用static关键字声明。静态函数只在本文件中有效。
1、static成员函数属于类,类外代码可以使用类名和作用域操作符来调用静态成员函数。
2、静态成员函数 只能引用属于该类的静态数据成员或静态成员函数 。类的静态成员函数不与任何对象相联系,它可以直接访问类的静态数据成员,而不能直接访问类的普通数据成员(即非静态数据成员),因为普通数据成员只有类的对象存在时才有意义。
3、static成员函数没有this指针,所以只能访问static数据成员。
4、 静态成员函数不可以同时声明为virtual、const、volatile函数。
5、静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。举例如下:
1 class base{
2 static int func1();
3 int func2();
4 };
5 int (*pf1)()=&base::func1;//普通的函数指针
6 int (base::*pf2)()=&base::func2;//成员函数指针
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,没有this指针,普通函数在每个被调用中维持一份拷贝