static关键词
静态变量具有全局变量的生命周期,但属于不同作用域。
- (全局)静态变量:作用域为本文件,无法在别的文件用
extern声明。 - 局部静态变量:作用域为所在代码块。
- 类内静态变量:作用域为类内。
静态成员函数只能访问类的静态变量,不能访问某个对象的非静态变量。
全局变量、(全局)静态变量、类内静态变量在编一起初始化
类内static
- 静态函数:在类内声明static,在类外定义时不能再用static,静态函数可以访问类的静态成员。
- 静态成员:静态成员不属于任何一个对象,所以他们并不是在创建类的对象时被定义的,也就是不能被构造函数初始化。要想定义全局变量一样定义静态对象。生命周期和全局变量一样。
通常,为了防止对象多次定义,最好把静态对象的定义放在定义文件,而不是头文件。但是也可以使用const或者constexpr来修饰static在类内定义一个常数。如果这个常数只是在类内使用,这么定义没问题,如果在类外需要使用这个常数,则必须在类内声明const static,在类外定义这个常数。
最好的做法是在类内初始化,也要在类外定义,但是类外定义不能带初始值。
静态对象可以是不完全类型,比如单例模式:
class C
{
private:
static C x;
int a,b,c;
C(int a, int b, int c) : a(a), b(b), c(c) {}
public:
C& get_instance()
{
return x;
}
};
C C::x(1,2,3);//类外初始化

浙公网安备 33010602011771号