引子:我們知道,在調用構造函數時,構造函數會自動初始化其非靜態成員,如:
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()
{
}
結果:

結論:類中的靜態成員只與自己是否手動初始化靜態成員有關,而與是否創建類的對象無關。即:如果你不手動初始化類的靜態成員,該靜態成員便永遠都不會被初始化。
