2013-02-23 172 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),编译器会生成一个隐式拷贝构造函数。