- 静态函数:在类内声明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);//类外初始化