构造函数能默认初始化其静态成员么?

mac2022-06-30  89

引子:我们知道,在调用构造函数时,构造函数会自动初始化其非静态成员,如:

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() { }

  

结果:

 

 结论:类中的静态成员只与自己是否手动初始化静态成员有关,而与是否创建类的对象无关。即:如果你不手动初始化类的静态成员,该静态成员便永远都不会被初始化。

转载于:https://www.cnblogs.com/XiaoXiaoShuai-/p/11504889.html

最新回复(0)