关于何时调用嵌入对象的复制构造函数的混淆

时间:2014-01-18 01:21:12

标签: c++ class copy-constructor composition

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的拷贝构造函数?

2 个答案:

答案 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来阅读它。