nit*_*ian 1 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;
}
Run Code Online (Sandbox Code Playgroud)
Type1:未为类示例显式声明的复制构造函数
(Type1显示在上面的代码中.然后编译器隐式生成类sample的复制构造函数).Line1执行语句时,首先class core调用复制构造函数,然后调用复制构造函数class sample.
Type2:为类示例显式定义的复制构造函数
Line1执行语句时,首先class core调用默认构造函数,然后调用复制构造函数class sample.
题:
为什么在Type1和Type2中提到的复制构造函数的行为有所不同?
因为您明确定义的复制构造函数sample不要求core调用复制构造函数.: core(obj)如果你想要实现这一点,你必须写.
换句话说,当您编写显式复制构造函数时,您将负责复制构造sample,包括其core子对象.通过以您完成的方式编写它,您已选择不使用初始化core子对象obj.由于您还没有说过如何进行初始化,因此编译器只使用了core默认构造函数,因此在您勾勒的第二种情况下会出现这种情况.
相比之下,在第一种情况下,编译器生成的默认复制构造函数sample确实要求core使用core复制构造函数初始化子对象,因此观察到的行为.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           729 次  |  
        
|   最近记录:  |