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);
}
};对于上面的代码,作者说:“WoCC类没有拷贝构造函数,但它的构造函数会将一条消息存储在一个内部字符串中,该字符串可以使用print( ).This构造函数在Composite’s构造函数初始化器列表中显式调用来打印输出。”
为什么必须在Composite的构造函数中显式调用WoCC构造函数?
发布于 2013-02-24 02:31:14
您可以省略显式构造,因为wocc将是隐式默认构造的。默认构造函数是不带参数的构造函数。WoCC有一个默认的构造函数,因为接受string的构造函数具有该字符串的默认值。
仅当您想要传递特定字符串时,才需要显式调用构造函数,就像本例中所发生的那样。
但是,如果参数没有默认值(删除= ""),那么您确实必须在Composose中显式调用正确的构造函数。这是因为定义任何自己的构造函数都会阻止编译器隐式地生成默认的构造函数。如果它没有默认构造函数,则需要确保为wocc成员调用了正确的构造函数。
此外,WoCC确实有一个复制构造函数。如果您没有定义一个隐式复制构造函数,则编译器会生成一个隐式复制构造函数(如果您提供了一个delete构造函数,编译器只会将其定义为move d)。
https://stackoverflow.com/questions/15043933
复制相似问题