在類中聲明變量/常量時,經常會用到static、const關鍵字。對於該變/常量的初始化問題,網上有許多相關文章,但是大多不夠完善,或者存在錯誤。經過實際驗證,總結如下:
(注明:測試編譯平台為VS2015和2010)

1 1 class TestClass 2 2 { 3 3 public: 4 4 TestClass()//:a(16) 5 5 { 6 6 cout << "TestClass Constructor ." << endl; 7 7 } 8 8 ~TestClass() 9 9 { 10 10 cout << "TestClass Destructor ." << endl; 11 11 12 12 } 13 13 14 14 int temp_a; // = 5; 15 15 static int temp_b; 16 16 const int temp_c; // = 25; 17 17 const static int temp_d; // = 35; 18 18 const static float temp_e; 19 19 };
int temp_a;
1、在聲明處初始化;
2、在構造函數初始化列表中初始化;
對於非static、非const聲明的變量,這兩種初始化可以同時使用,同時使用時列表中的值會自動覆蓋聲明處的值。初始化不是必須的,若不進行初始化,其值是不確定的,可簡單認為是隨機的。該變量屬於對象。
static int temp_b;
必須在類的聲明體外進行定義(若在定義時不給初值,則編譯器自動賦予默認值,int型變量的默認值為0),定義時不使用關鍵字static。例如:int TestClass::temp_b = 12;
該變量屬於類,不屬於特定的對象,可以理解為全局的,為所有所實例化的對象所共享。可在程序中通過類名作用域符號的方式訪問(如:TestClass::temp_b = 18;),也可以通過對象訪問。
const int temp_c;
1、在聲明處初始化;
2、在構造函數初始化列表中初始化;
必須初始化,這兩種初始化可以同時使用,同時使用時構造函數初始化列表中的值會自動覆蓋聲明處給的初值。
該常量屬於對象,在對象聲明時進行初始化,對象聲明以后就不能再改變常量的值,即在對象的生存周期內其值不變。
const static int temp_d;//char short int long
1、在聲明處初始化;(在聲明處初始化,則可以不用在類的聲明體外進行定義)
2、在類的聲明體外進行定義並初始化;const int TestClass::temp_d = 15;
必須初始化,並且只能有一次初始化賦值(即1和2中,二選一)。char、short、long型靜態常量都屬於這種情況。
靜態常量屬於類,為所有的對象共享,既然是常量,初始化以后肯定就不能再有賦值操作。
const static float temp_e; //float double
只能且必須在類的聲明體外進行定義和初始化 const float TestClass::temp_e = 0.234f; 靜態常量的浮點型數據屬於這種情況。
簡單總結一下:
1、僅僅有關鍵字const,由於是常量,就必須進行初始化;可在聲明處和構造函數列表中進行初始化,可以二選一,亦可以在這兩處都初始化,初始化列表中的賦值會自動覆蓋聲明處的值。
2、僅僅有static,由於是靜態變量,屬於類本身,則必須在類的生命體外進行定義(若不給初值,則為默認值)
3,同時又static和const,這兩個關鍵字的前后順序無所謂,由於是靜態常量,即同時具有靜態和長常量的屬性,使用條件就更加苛刻(即為一個常量,那就必須有初始化,並且還是靜態的,那就自然屬於類本身了)。整形數據可以在聲明處初始化或者在類的聲明體外進行定義並初始化,二選一。浮點型數據只能且必須在類的聲明體外進行定義並初始化。
僅在VS平台進行了測試,若有不對之處,敬請指正,希望多多交流,共同進步。