static
C++中的类成员声明static
- 函数体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
- 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问;
- 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
- 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
- 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
类内:
- static类对象必须要在类外进行初始化,static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化;
- 由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。
- 正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员;
- static成员函数不能被virtual修饰,static成员不属于任何对象或实例,所以加上virtual没有任何实际意义
- 静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为virtual;
- 虚函数的调用关系,this->vptr->ctable->virtual function
静态变量什么时候初始化
- 初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内存。
- 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存
- 在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化
- 所以在C语言中无法使用变量对静态局部变量进行初始化
- C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理