任何变量都有其作用域、存储位置以及生存周期。对于static修饰的变量(静态变量)而言,其生存周期为整个程序运行期间。
- 全局静态变量(Global Static Variable)
在全局变量之前加上static关键字,就变成一个全局静态变量.
存储位置:静态(全局)存储区,整个程序运行期间一直存在。
作用域:静态全局变量对于其他外部文件是不可见的,准确地说是从定义之处开始,一直到文件结尾。 - 局部静态变量(Local Static Variable)
在局部变量之前加上static关键字,就变成一个静态局部变量。
存储位置:静态存储区,整个程序运行期间一直存在。
作用域:定义该变量的函数或者该变量所在的语句块。但是当程序离开该函数或语句块后,静态局部变量仍然会保留在内存当中,不会被释放,只不过我们不能再对它进行访问,直到该函数或语句块再次被调用,并且值不变。 - 静态函数
在函数的返回类型之前加上static关键字,该函数就变成一个静态函数。
存储位置:代码区,整个程序运行期间一直存在。
作用域:C++中函数的声明和定义默认情况下都是extern,但由static关键字修饰的静态函数只在声明和定义他的文件中可见,且不能被其他外部文件所用。
warning:不要在头文件中声明静态函数,不要在源文件中声明非静态函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰; - 静态成员变量
在类中,静态成员变量可以实现多个对象之间的数据共享,并且使用静态成员变量不会破坏C++中的隐藏原则,保证了安全性。因此,静态成员变量是类的成员,而不是某个对象的成员。
内存中的位置:静态存储区、全局区。 - 静态成员函数
静态成员函数和静态成员变量一样,都属于类的成员。因此,对静态成员函数的调用不需要声明对象。
内存中的位置:代码区。
Warning:静态成员函数的实现中不能直接引用类中的非静态成员,只能引用类中声明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);