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
构造函数初始化列表“。
为什么必须在WoCC
的构造函数中显式调用Composite
构造函数?
答案 0 :(得分:1)
您可以高兴地省略显式构造,因为wocc
将隐式构造。默认构造函数是不带参数的构造函数。 WoCC
有一个默认构造函数,因为带string
的构造函数具有该字符串的默认值。
如果要传递特定的字符串,则只需要显式调用构造函数,就像在这种情况下一样。
但是,如果参数没有默认值(删除= ""
),那么你确实必须在Composose
中显式调用正确的构造函数。这是因为定义任何自己的构造函数会阻止编译器隐式生成默认的默认构造函数。如果它没有默认构造函数,那么您需要确保为wocc
成员调用正确的构造函数。
此外,WoCC
确实有一个复制构造函数。如果你没有定义一个隐式拷贝构造函数,它就会生成一个隐式拷贝构造函数(如果你提供一个移动构造函数,它只会将它定义为delete
。)