引子:我們知道,在調用構造函數時,構造函數會自動初始化其非靜態成員,如:
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() { }
結果:
結論:類中的靜態成員只與自己是否手動初始化靜態成員有關,而與是否創建類的對象無關。即:如果你不手動初始化類的靜態成員,該靜態成員便永遠都不會被初始化。