自C语言以来,static就是个容易让人迷惑的关键字,因为根据使用场合的不同,它表示两种差别甚远的意义。
《C和指针》一书给出精要的解释:
- 用于函数定义,或者用于代码块之外的变量声明
- 当static用于代码块内部的变量声明时
在C++中,static又多了两种使用场合:
- 定义类的静态数据成员
静态数据成员必须定义在类的外部(不允许内联)而且只能定义一次。因此它通常放在一个类实现文件中。变量定义时才会分配存储区域,如果一个静态数据成员只在类定义中有声明,却没有定义,连接器将报错。
- 定义类的静态成员函数
通常,当前对象的地址(this)是隐式地传递到被调用函数的,但static成员函数不和具体对象相关,没有this指针,也就无法找到对象中的非静态成员。在static成员函数中只能访问静态数据成员,也只能调用其它的静态成员函数。并且,对一个static成员函数的所有调用者来说,static成员函数中定义的局部变量都只有一份拷贝。
static成员函数不能被声明为const。因为static成员不是任何对象的组成部分,而将成员函数声明为const表示不会修改该函数所属的对象。
static成员函数不能被声明为虚函数。