C++模板類中靜態成員變量構造函數、析構函數未被調用

簡要說明

c++模板類中使用靜態成員變量,如果此變量除了初始化聲明外,沒有被其它地方使用,則此靜態成員變量的構造函數、析構函數均不會被調用。

以下是網友解說(注:上述是在模板類的前提下才成立,讀者可自行驗證之):

這涉及到C++的一個哲學觀點:不要爲不必要的成本付出代價。所以C++編譯器通常只有第一次使用靜態變量時纔會進行初始化,這種情況與C++的就地聲明有類似的原因。

參看:模板類的靜態成員初始化問題?

例子

#include <iostream>

using namespace std;

class Test
{
public:
	Test()
	{
		cout << "Test::Test()" << endl;
	}

	~Test()
	{
		cout << "Test::~Test()" << endl;
	}
};


template <class T>
class TemplateTest
{
public:
	TemplateTest()
	{
		cout << "TemplateTest::TemplateTest()" << endl;
		
		//此句很重要,若無此句,Test的構造函數與析構函數均不會被調用到。
		//模板類中的靜態成員未被其它代碼使用時,編譯器就不初化這個靜態
		//成員。故此處顯示寫一句,告訴編譯器要初始化靜態成員變量。
		g_Test;
	}

	~TemplateTest()
	{
		cout << "TemplateTest::~TemplateTest()" << endl;
	}
private:
	static Test g_Test;
};


template <class T>
Test TemplateTest<T>::g_Test;



int main()
{
	TemplateTest<int> mTest;

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章