从复制构造函数调用2种不同类型的构造函数

时间:2011-12-30 19:30:37

标签: c++ copy-constructor default-constructor implicit-declaration

请考虑以下示例代码:

#include <iostream>

using namespace std;

class core
{
   public:
      core(const core& obj)
      {
         cout << "core copy ctor called\n";
      }
      core()
      {
         cout << "core default ctor called\n";
      }
};

class sample : public core
{
   public:
      sample()
      {
         cout << "sample default ctor called\n";
      }
#if 0
      sample(const sample& obj)
      {
         cout << "sample copy ctor called\n";
      }
#endif
};

int main()
{
   sample s1;
   sample s2 = s1; //Line1
   return 0;
}

Type1:未明确为类样本声明的复制构造函数

(Type1显示在上面的代码中。然后编译器隐式生成类sample的复制构造函数)。 执行语句Line1时,首先调用class core的复制构造函数,然后调用class sample的复制构造函数。

Type2:为类样本明确定义的复制构造函数

当执行语句Line1时,首先调用class core的默认构造函数,然后调用class sample的复制构造函数。

问题:

为什么在Type1和Type2中提到的复制构造函数的行为存在差异?

1 个答案:

答案 0 :(得分:7)

因为您为sample明确定义的复制构造函数不要求调用core的复制构造函数。如果你想要实现这一点,你必须写: core(obj)

换句话说,当您编写显式复制构造函数时,您将负责sample的复制构造,包括其core子对象。通过以您完成的方式编写它,您已选择不使用core初始化obj子对象。由于您尚未说明 希望如何进行初始化,因此编译器只使用core的默认构造函数,因此在您概述的第二种情况下会出现这种情况。

相比之下,在第一种情况下,sample的编译器生成的默认复制构造函数确实要求使用core的复制构造函数初始化core子对象,因此观察到的行为。