2013-02-23 176 views
0
class WithCC { // With copy-constructor 
public: 
    // Explicit default constructor required: 
    WithCC() {} 
    WithCC(const WithCC&) { 
    cout << "WithCC(WithCC&)" << endl; 
    } 
}; 

class WoCC { // Without copy-constructor 
    string id; 
public: 
    WoCC(const string& ident = "") : id(ident) {} 
    void print(const string& msg = "") const { 
    if(msg.size() != 0) cout << msg << ": "; 
    cout << id << endl; 
    } 
}; 

class Composite { 
    WithCC withcc; // Embedded objects 
    WoCC wocc; 
public: 
    Composite() : wocc("Composite()") {} 
    void print(const string& msg = "") const { 
    wocc.print(msg); 
    } 
}; 

我正在閱讀思考C++第11章默認的複製構造函數。 對於上面的代碼,作者說:「類WoCC沒有複製構造函數,但其​​構造函數將存儲消息在一個內部字符串,可以打印出使用 print()。此構造函數明確調用Composite’s構造函數初始值設定項列表」。瞭解默認的構造函數C++

爲什麼WoCC constrcutor必須在Composite的構造函數中明確調用?

+0

'WoCC'沒有拷貝構造函數。既然你沒有聲明一個,它會得到一個*隱式聲明的*拷貝構造函數。 – aschepler 2013-02-23 18:27:55

回答

1

您可以愉快地省略顯式構造,因爲wocc將隱含默認構造。默認的構造函數是不帶參數的構造函數。 WoCC有一個默認的構造函數,因爲採用string的構造函數具有該字符串的默認值。

如果您想要傳遞特定的字符串,則只需顯式調用構造函數,就像在這種情況下發生的那樣。但是,如果參數沒有默認值(刪除= ""),那麼您確實必須在Composose中顯式調用正確的構造函數。這是因爲定義你自己的構造函數會阻止編譯器隱式地生成一個默認的構造函數。如果它沒有默認構造函數,那麼您需要確保爲wocc成員調用正確的構造函數。

此外,WoCC確實有一個複製構造函數。如果你沒有定義一個隱式拷貝構造函數(如果你提供了一個移動構造函數,它只會將其定義爲delete d),編譯器會生成一個隱式拷貝構造函數。