構造函數能默認初始化其靜態成員么?


引子:我們知道,在調用構造函數時,構造函數會自動初始化其非靜態成員,如:

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

  

結果:

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM