C++: static
一. 修饰全局变量
全局变量加上static就成了静态全局变量。
存储位置:在程序的静态/全局区
生命周期:整个软件运行周期。
作用域:只在该文件中全局可见。
初始化:没有专门初始化的变量,默认为0。
二. 修饰局部变量
只有作用域与静态全局变量不同,作用在局部。但是随着函数的结束并不销毁,当函数再次进入时还是上一次调用的结果。
三. 修饰全局函数
将全局函数的作用域限制在当前文件中。
注意:不要在头文件中声明static函数。如果只在cpp文件中声明函数,需要加上static声明。
四. 修饰类成员变量
类的所有对象共用这一个成员变量。
在内存中只有一份,所以 不占用对象的内存:使用sizeof(class)不会计算static 成员变量的内存。
五. 修饰类成员函数
不能访问非静态成员变量,可以访问静态成员变量。
static类的静态成员函数:
可以访问类中的私有成员。
class A{ public: static int modify(A* a) { a->m_n = 1; } private: int m_n; }
静态变量初始化时机:
对于全局变量,全局静态变量,类静态成员变量分为:
静态初始化:以常量对变量进行赋值的。
在程序加载时进行初始化。
动态初始化:需要调用函数进行初始化的(包括构造函数),
是在main函数前由静态初始化过程分配内存并且初始化。
对于局部静态变量,在第一次调用时进行初始化。
对于初始化时线程安全性:
c++11前,语言特性不保证初始化时的线程安全。
c++11后,保证了线程的安全。