gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:39:31 25 4
gpt4 key购买 nike

考虑下面的示例代码:

#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;
}

类型 1:未为类示例显式声明复制构造函数

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

Type2:为类示例明确定义的复制构造函数

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

问题:

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

最佳答案

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

换句话说,当您编写显式复制构造函数时,您负责sample 的复制构造,包括其core 子对象。通过按照您的方式编写它,您已选择不使用 obj 初始化 core 子对象。由于您还没有说您希望它如何初始化,编译器只是使用 core 的默认构造函数,因此您概述了第二种情况下的行为。

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

关于c++ - 2种不同类型的构造函数从复制构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com