簡要說明
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;
}