任何变量都有其作用域、存储位置以及生存周期。对于static修饰的变量(静态变量)而言,其生存周期为整个程序运行期间。

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