2011-07-17 82 views
1

可能重複:
What is this weird colon-member syntax in the constructor?C++構造

如果我定義如在C++中以下所示的類:

class myclass 
{ 
public: 
myclass (unsigned int param) : param_ (param) 
{ 
} 

unsigned int param() const 
{ 
return param_; 
} 

private: 
    unsigned int param_; 
}; 

什麼構造定義: myclass (unsigned int param) : param_ (param)裝置和代碼的好處?

回答

11
myclass (unsigned int param) : param_ (param) 

這種結構被稱爲成員初始化列表在C++中。

初始化您的會員param_的值爲param


是什麼初始化之間分配的內部構造的區別? &
有什麼優勢?

初始化使用初始化列表的成員並在構造函數體內爲其指定值之間有區別。

當你通過初始化列表初始化字段時,構造函數將被調用一次。

如果您使用賦值,那麼這些字段將首先使用默認構造函數進行初始化,然後使用實際值重新分配(通過賦值運算符)。

正如你所看到的那樣,在後者中創建&賦值會有額外的開銷,這對於用戶定義的類可能相當重要。

對於整數數據類型(爲此使用它)或POD類成員,沒有實際的開銷。


當你HAVE TO使用成員初始化列表?
你將有(而被迫)使用,如果一個成員初始化列表:

你的類有一個基準件
你的類有一個const成員或
你的類沒有默認構造函數


甲代碼示例描繪HAVE TO情況:

class MyClass 
{ 
    public: 
     int &i;  //reference member, has to be Initialized in Member Initializer List 
     int j; 
     const int k; //const member, has to be Initialized in Member Initializer List 

    MyClass(int a, int b, int c):i(a),j(b),k(c) 
    { 

    } 
}; 

class MyClass2:public MyClass 
{ 
    public: 
     int p; 
     int q; 
     MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m) 
     { 
     } 

}; 

int main() 
{ 
    int x = 10; 
    int y = 20; 
    int z = 30; 
    MyClass obj(x,y,z); 

    int l = 40; 
    int m = 50; 
    MyClass2 obj2(x,y,z,l,m); 

    return 0; 
} 

MyClass2沒有默認構造函數,因此必須通過成員初始值設定項列表進行初始化。

+0

請停止傳播此功能的術語「初始化程序列表」。初始化程序列表不同。 –

+0

請教,什麼是「初始化列表」?據我所知,這是正確的術語,並且Google同意... –

+0

@Tomalak:什麼是正確的術語? 「初始化列表」和「初始化列表」是我聽過或看到過的唯一兩個。但重要的是,如果你知道不同的話,那就很重要。 –

4

對您的代碼的好處是......好吧,什麼?!那你的代碼。它的好處是它可以做它所說的。相比於什麼選擇?爲了你的代碼有所不同?不同的如何?

myclass (unsigned int param) : param_ (param) {} 

冒號和下面的列表是ctor-initializer(做 稱之爲「初始化列表」,這是一件好事在C++完全不同)。它允許你初始化對象的成員。

請注意,以下內容並不相同;你只分配會員後 - 事實:

myclass (unsigned int param) { 
    param_ = param; 
} 

它不會真正使在這種情況下的差異,與unsigned int,但一旦你開始處理參考成員和const成員,沒有默認構造函數的成員,你發現你必須初始化。