请考虑以下示例代码:
#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中提到的复制构造函数的行为存在差异?
答案 0 :(得分:7)
因为您为sample
明确定义的复制构造函数不要求调用core
的复制构造函数。如果你想要实现这一点,你必须写: core(obj)
。
换句话说,当您编写显式复制构造函数时,您将负责sample
的复制构造,包括其core
子对象。通过以您完成的方式编写它,您已选择不使用core
初始化obj
子对象。由于您尚未说明 希望如何进行初始化,因此编译器只使用core
的默认构造函数,因此在您概述的第二种情况下会出现这种情况。
相比之下,在第一种情况下,sample
的编译器生成的默认复制构造函数确实要求使用core
的复制构造函数初始化core
子对象,因此观察到的行为。