C/C++ 提供 static 关键字修饰变量, 而这个关键字在不同场合下的用法是在是千奇百怪,因此我决定做一个总结.

C 语言中的 static

首先,当 C 语言引入这个关键字的时候,它的意思可以概括为: 将被修饰的变量放到程序文件的数据段中. 因此, 它有如下特性:

  • 修饰的变量的作用域最大为本文件.
  • 修饰的变量的生命周期为程序运行期间, 因此可以在一个函数内定义一个静态变量而在外部引用它.
  • 修饰的变量只初始化一次.

也因此,它有如下限制:

  • 修饰的变量必须用常量表达式初始化.
  • 修饰的变量不能出现在结构体内, 除非结构体也是静态的.(因为一个结构体只能使用一块连续的内存)

C++ 中的 static

C++ 继承了 C 语言的 static 用法,但是为了一时图方便, 就像承认 const 的常量性那样,允许静态变量用变量表达式初始化.

除此之外,C++ 引入了类,顺便用 static 来表示类域和类方法. 修饰的域和方法属于类而不是某个具体的对象。因此,它有如下特性:

  • 修饰的类域初始化时不受所在类的访问修饰符限制. 因为它是属于类内部的域.

但是它有如下限制:

  • 静态域不能在类中初始化, 但是有 const 修饰的静态域可以直接初始化,对静态成员初始化,需要在类之外定义时再完成;