2013-10-24 55 views
-1

我讀我的書,它說:「對於所有的參數提供默認參數的構造函數也定義了默認構造函數」那麼一個類可以有兩個默認的構造函數嗎?

所以在下面的代碼:一個使用

class Book { 

    public: 

    int pages = 25; 
    double price = 10.0; 
    std::string font = "Times New Roman"; 

    Book() {} 
    Book(int n, double p, std::string f): pages(n), price(p), font(f) { } 
}; 

兩個構造沒有參數和爲其參數提供默認參數的構造函數是默認構造函數?或默認參數是否意味着第二個構造將需要看起來像:圖書():頁(5),價格(46),字體(「宋體」){}

+6

默認參數表示類似於「Book(int n = 0,double p = 0.0 ... etc.」),所以你的第二個構造函數不會是默認的ctor。「 –

+0

」也定義了默認構造函數「應該表示」也可以用來定義默認構造函數「。它並不打算暗示你可以有意義地擁有兩個默認的構造函數。 –

+0

@PeteBecker我不知道標準中的措辭是否真的是錯誤的。它說「默認構造函數」,而不是「默認構造函數(候選)」。這是否意味着我給出的答案應該被標準的符合編譯器拒絕?還是應該澄清措辭,因爲沒有「默認構造函數」這樣的東西? –

回答

1

的構造方法爲其所有參數提供默認參數還定義了默認構造函數

這意味着使用默認參數。在你的榜樣,這意味着:

Book(int n = 5, double p = 46, std::string f = "Times New Roman") : 
    pages(n), 
    price(p), 
    font(f) {} 
2

如果你可以構造你的對象,而不調用構造函數明確*,那麼你有一個默認構造。一個類有一個默認的構造函數:

  • 如果你沒有創建任何構造函數。 (= default

  • 如果您創建一個沒有任何參數的構造函數。

  • 如果您創建一個構造函數,其所有參數都具有默認值。


*要清除的語句,你必須使對象像下面的能力:

Book book; 
+1

@clcto:這不是一個默認的構造函數。這是一個參數構造函數。不同之處在於,在* default-initializing *實例時使用默認構造函數。默認初始化是當你聲明實例變量並且不給它任何東西時發生的事情。 – greyfade

+0

@M M.在我的例子中,寫作Book(){}和寫作Book()= default之間有區別嗎? ?它似乎有相同的效果,但我的書說如果有另一個構造函數,那麼我應該使用= default。 – FrostyStraw

+0

@FrostyStraw:沒有區別。我不確定這本書的說法。 – deepmax

2

有趣的是,你的類可以有多個構造過載,它可以在沒有參數的情況下工作,因此是有效的默認構造函數:

struct A 
{ 
    A() {} 
    A(int i = 0) {} 
}; 

這是完全合法的寫作。標題問題的答案是:是的。唯一的問題是你不能使用它們 - 它們是模棱兩可的。當你寫:

A a; 

你會得到一個錯誤,因爲兩者都會匹配。

0

您正在使用有關構造函數的類型。所以有三個,默認構造函數由編譯器,缺省構造函數由程序員使用默認參數,缺省構造函數由程序員沒有默認參數。所以你在談論第二種類型。是的,這是一種默認結構

相關問題