2013-11-28 28 views
1

我在閱讀有關C++中的基本/成員初始化的知識,但我並不瞭解真正發生了什麼。考慮下面的例子Date類:基礎成員初始化vs在類聲明中分配默認值

// CLASS DECLARATION 
class Date 
{ 
    private: 
     int month; 
     int day; 
     int year; 
    public: 
     Date(int = 7, int = 4, int = 2012);  // CONSTRUCTOR 
     Date(const Date&);      // COPY CONSTRUCTOR 
     void showDate();  // MEMBER FUNCTION TO DISPLAY DATE 
}; 

人們可以創建由Date對象:Date a;這將分配的a成員變量到2012年7月4日。現在就是做一個基地成員初始化如下面的區別:

// class declaration section 
public: 
    Date(int mo=7, int da=4, int yr=2012):month(mo), day(da), year(yr) {} 

這相當於:

// class declaration section 
public: 
    Date(int = 7, int = 4, int = 2012); // prototype with defaults 
// class implementation section 
Date::Date(int mo, int da, int yr) : month(mo), day(da), year(yr) {} 

能有人請解釋這兩種情況之間的差異?有什麼區別,你爲什麼要做第二種情況?它只是在構造函數中初始化默認值的另一種方式,還是有更多的方法呢?謝謝。

回答

1

基本上沒有區別。在第一種情況下,您在一個步驟中聲明AND定義構造函數(因此括號爲{})。在第二種情況下,您首先聲明您的構造函數,然後定義/實現它。但初始化列表只能在定義中,而不能在聲明中。

1

只要參數未被顯式傳遞,默認參數就會被替代。這意味着void f(int a = 5)可以通過編寫f()來調用,這相當於f(5)。但是您也可以明確地傳入不同的值,例如f(3)

但是,在你的例子中,這兩個片段並不是真的等價,因爲構造函數Date(int mo=7, int da=4, int yr=2012)也可以用Date(5)來調用,這相當於Date(5, 4, 2012)

編輯:哦,對不起,你明確要求在實施中的差異。缺省參數僅用於聲明中,因爲缺省值必須在調用站點傳遞,而實現可能不可見(即,如果在另一個翻譯單元/ .cpp文件中定義)。

1

我看到唯一的區別是函數,包括默認內聯類定義中定義的構造函數。 第二種情況允許您分開聲明和定義。

相關問題