天天看點

C++初始化成員清單

C++初始化類的成員,不但可以用構造函數(constructor)完成,而且可以用初始化類成員清單來完成。MFC大量用到此方法。例如有些初學者可能不大了解如下代碼: class A {   public:     int member_var; //成員變量     A();            //構造函數 } A::A() :member_var(0) { }   他們覺得這個構造函數的定義應該隻能這樣寫: A::A() {    member_var=1; }   其實兩種方法都可。但是有些情況下,隻能用第一種,而且通常情況下用第一種也會效率高些。   其實,第一種方法是真正的初始化(initialization),而在構造函數内實作的“=”操作其實是指派(assign)。這兩種方法的一切差別從這兒開始。差別大概如下:  

  1. 我們知道普通變量編譯器都會預設的替你初始化。他們既能初始化,也能被指派的,而常量(const)按照其意思隻能被初始化,不能指派。否則與變量就無差別了。是以常量成員(const member)隻能用成員初始化清單來完成他們的“初始化”,而不能在構造函數内為他們“指派”。
  2. 我們知道類的對象的初始化其實就是調用他的構造函數完成,如果沒有寫構造函數,編譯器會為你預設生成一個。如果你自定義了帶參數的構造函數,那麼編譯器将不生成預設構造函數。這樣這個類的對象的初始化必須有參數。如果這樣的類的對象來做另外某個類的成員,那麼為了初始化這個成員,你必須為這個類的對象的構造函數傳遞一個參數。同樣,如果你在包含它的這個類的構造函數裡用“=”,其實是為這個對象“指派”而非“初始化”它。是以一個類裡的所有構造函數都是有參數的,那麼這樣的類如果做為别的類的成員變量,你必須顯式的初始化它,你也是隻能通過成員初始化清單來完成初始化。例如:

class B

{

......

} class A

{

  public:

  B member_b;

  A();

}

A::A(): B(...) //你必須顯式初始化它,因為他的所有構造函數

              //都是有參數的,之後才能被指派。

{

  B=...; //因為如上所寫,已經初始化了,才能被指派,否則錯誤。

}   —————————————————————————————————————— 初始化順序: class test {        const int a;        std:string str;        object o;        test():str(“df”),o(null),a(0) { }     };   黃色的既是初始化清單,他們會在構造函數正式調用前被調用,且他們的初始化順序并不是根據 初始化清單中出現的順序,而是他們聲明的順序來初始化。如上: 初始化順序是:a, str, o; 一般用于初始化 常量類型,靜态類型的資料,或者不能獨立存在的資料