引子:我们知道,在调用构造函数时,构造函数会自动初始化其非静态成员,如:
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() { }
结果:
结论:类中的静态成员只与自己是否手动初始化静态成员有关,而与是否创建类的对象无关。即:如果你不手动初始化类的静态成员,该静态成员便永远都不会被初始化。