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);
}
};
我正在阅读 thinking in c++ 第 11 章默认复制构造函数。
对于上面的代码,作者说:“类 WoCC
没有复制构造函数,但是它的构造函数会在内部字符串中存储一条消息,可以使用
print( )
。此构造函数在 Composite 的
构造函数初始化列表中显式调用。
为什么必须在 Composite
的构造函数中显式调用 WoCC
构造函数?
最佳答案
您可以愉快地省略显式构造,因为 wocc
将隐式默认构造。默认构造函数是不带参数的构造函数。 WoCC
有一个默认构造函数,因为采用 string
的构造函数具有该字符串的默认值。
只有在您想要传递特定字符串时才需要显式调用构造函数,正如本例中所发生的那样。
但是,如果参数没有默认值(删除 = ""
),那么您确实必须在 Composose
中显式调用正确的构造函数。这是因为定义任何您自己的构造函数都会阻止编译器隐式生成默认的默认构造函数。如果它没有默认构造函数,那么您需要确保为 wocc
成员调用了正确的构造函数。
此外,WoCC
确实有一个复制构造函数。如果您不定义一个隐式复制构造函数,编译器将生成一个隐式复制构造函数(如果您提供一个移动构造函数,它只会将其定义为 delete
d)。
关于c++ - 理解默认构造函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15043933/