class WithCC {
public:
WithCC() {}
WithCC(const WithCC&) {
cout << "in WithCC's copy constructor" << endl;
}
};
class Composite {
WithCC withcc; // Embedded objects
public:
Composite() {}
};
int main() {
Composite c;
Composite c2 = c;
}
使用上面的代码,调用withcc的复制构造函数,我得到输出: WithCC的复制构造函数
但是如果我像这样将复制构造函数添加到Composite ......
class Composite {
WithCC withcc; // Embedded objects
public:
Composite() {}
Composite(const Composite&) {
cout << "in composite's copy constructor" << endl;
}
};
withcc的复制构造函数似乎没有被调用,因为输出是: 复合构建函数中的
为什么不在这里调用withcc的拷贝构造函数?
答案 0 :(得分:3)
在第一个示例中,您省略了Composite
的复制构造函数,因此C ++为您生成了一个默认值。这个默认值基本上按字段副本运行字段,因此运行WithCC
的复制构造函数。
当您明确定义复制构造函数时,C ++没有任何魔力。您可以根据需要复制字段。例如
Composite(const Composite& other) : withcc(other.withcc) {
cout << "in composite's copy constructor" << endl;
}
答案 1 :(得分:1)
编译器隐式定义的复制构造函数执行其基础和成员的成员复制/移动。
如果未在ctor-list中显式调用其构造函数,则用户定义的复制构造函数defaault会初始化派生类的子对象。
因此,在您的上一个代码段中,您明确定义了复制构造函数
Composite(const Composite&) {
cout << "in composite's copy constructor" << endl;
}
但是它的ctor列表是空的。因此,带有cc的数据成员将被默认初始化。
我在文章
中更详细地描述了这一点Implicitly defined copy constructor and explicitly defined copy constructor: what is the difference?
虽然它是用俄语写的,但你可以使用google service translare来阅读它。