2012-11-28 103 views
3

完整代碼。線稍後指定。C++:類和構造函數:使用初始化列表初始化字段

#include <iostream> 
#include <string> 

using namespace std; 

class X 
{ 
    private: 

    int i; 
    float f; 
    char c; 

    public: 

    X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { } 
    void print() { cout << i << " " << f << " " << c << endl;} 

}; 


int main() 
{ 
    X var1; 
    var1.print(); 

    return 0; 
} 

究竟是怎麼回事在這條線:

X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { } 

至於我能理解(可能是錯的),我們首先聲明的對象,第二,和類型的第三個(類)十,我們正在申報期間對它們進行初始化。冒號後發生了什麼?這是怎麼回事?

+0

你應該真的在這裏指定語言...理想地在一個標籤和標題。 即使如此,這可能不是最好的問題... –

+0

對不起,下次再做。按下提交按鈕後實現了它。 – user1478983

+4

構造函數初始值列表是C++語言的基本特徵。這是你在你最喜歡的C++書中讀到的。 – AnT

回答

2

括號中的內容是構造函數參數的默認值,冒號後面的內容在冒號後面初始化這些項。

冒號表示法最常用於調用類使用的其他對象的構造函數。

+0

這是否相當於這樣說:如果我們聲明X類型的對象Y,那麼Y.first將具有默認值1,Y.second將具有默認值2.0,Y.third將具有默認值a。冒號後,我被賦予默認值1,f = 2.0,c = a。那麼,在這種情況下,我(1)是指i = 1? – user1478983

+0

說什麼?我認爲你的消息被截斷了。 – RonaldBarzell

+0

更新的評論^ – user1478983

1
X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { } 

這是X的構造函數有三個agruments,每一個都具有默認值,以便它可以以不同的方式在參數之後

X myX; 
X myX(first); 
X myX(first, second); 
X myX(first, second, third); 

的部分被調用

: i(first) , f(second) , c(third) 

i,fc成員的初始值設定項。如果可能的話,這種初始化方式優先於函數體中的初始化,如果這些成員是常量類型,則此樣式是必需的。

然後有一個空的身體構造{}

2

你有X類有三個領域:I,F,C。 您定義了一個具有三個默認參數的構造函數 - 當此構造函數調用的字段使用參數初始化時(傳遞給構造函數或默認值)。 這就像:

X (int first=1, float second=2.0, char third='a') 
{ 
    i = first; 
    f = second; 
    c = third; 
} 

你行僅僅是一個另一種方式來初始化領域,通常它們是相等的(沒有與繼承一些差異)。

在您的主代碼中,您將創建一個類型爲X的局部變量var1,因此將調用該構造函數。您不傳遞任何參數,因此使用默認值。

因此,您有一個類型X的本地對象使用構造函數中列出的默認值進行了初始化。

3

究竟是怎麼回事在這條線:

X(int first=1, float second=2.0, char third='a') 
: i(first) , f(second) , c(third) { 
} 

這是一個構造函數,需要3個參數的默認值。

這部分: i(first) , f(second) , c(third)被稱爲member initializer list。成員初始值設定項列表由 由以冒號開頭的逗號分隔的初始值設定項列表組成。它放置在參數列表的括號之後,並且位於函數體的左括號之前。

只有構造函數可以使用這個初始化列表語法。 const類成員必須在成員初始值設定項中初始化。