引子:我们知道,在调用构造函数时,构造函数会自动初始化其非静态成员,如:
class NotStaticMember
{
public:
NotStaticMember(){ cout << "NotStaticMember() is called" << endl; }
~NotStaticMember(){ cout << "~NotStaticMember() is called" << endl; }
};
class CanIniNotStaticMember
{
public:
CanIniNotStaticMember() = default;
~CanIniNotStaticMember() = default;
private:
NotStaticMember nsm;
};
int main()
{
CanIniNotStaticMember cinsm;
}
结果:
探索:那么构造函数能默认初始化其静态成员么?做个实验便知:
case1:不在函数外部定义 nsm,在main函数里也不定义StaticMember的实例
class StaticMember
{
public:
StaticMember(){ cout << "StaticMember() is called" << endl; }
~StaticMember(){ cout << "~StaticMember() is called" << endl; }
};
class CanIniStaticMember
{
public:
CanIniStaticMember() = default;
~CanIniStaticMember() = default;
private:
static StaticMember sm;
};
int main()
{
}
结果:
结论:在程序编译期间并不会自动初始化类中的静态成员。
case2:不在函数外部定义 nsm,在main函数里定义StaticMember的实例
int main()
{
CanIniStaticMember cism;
}
结果:
结论:构造函数不会自动初始化静态成员。
case3:在函数外部定义 sm,在main函数里不定义CanIniStaticMember的实例
StaticMember CanIniStaticMember::sm;
int main()
{
}
结果:
结论:类中的静态成员只与自己是否手动初始化静态成员有关,而与是否创建类的对象无关。即:如果你不手动初始化类的静态成员,该静态成员便永远都不会被初始化。