c++ - 为什么我的 C++ 程序的复制构造函数被调用了两次?
问题描述
我不知道为什么我的输出以“ACCB..”开头 - 我的期望是“ACB..”
为什么复制构造函数被class A
调用了两次?
#include <iostream>
using namespace std;
class A
{
int x, y, z;
public:
A(int x, int y, int z) :x(x), y(y), z(z) { cout << "A"; }
A(A& a) :x(a.x), y(a.y), z(a.z) { cout << "C"; }
void sh() { cout << x << y << z; }
};
class B
{
A a;
int q, r;
public:
B(A x, int y, int z) : a(x), q(y), r(z) { cout << "B"; }
void sh() { a.sh(); cout << q << r; }
};
int main()
{
A i(9, 7, 4);
B b(i, 3, 7);
b.sh();
}
解决方案
您的复制构造函数被调用了 2 次,因为您正在制作 2 个副本。1 是由编译器隐式生成的,而 1 是在您自己的代码中显式生成的。
在您的B
构造函数中,它的x
参数是通过value传递的。i
这是在将inmain()
分配给时进行的隐式复制x
。然后,当x
传递给 的a
成员的复制构造函数时,会进行显式复制B
。
您可以通过更改要通过引用x
传递的参数来消除隐式副本。
此外,您的A
复制构造函数应声明为A(const A& a)
.
#include <iostream>
using namespace std;
class A
{
int x, y, z;
public:
A(int x, int y, int z) :x(x), y(y), z(z) { cout << "A"; }
A(const A& a) :x(a.x), y(a.y), z(a.z) { cout << "C"; }
void sh() { cout << x << y << z; }
};
class B {
A a;
int q, r;
public:
B(const A& x, int y, int z) : a(x), q(y), r(z) { cout << "B"; }
void sh() { a.sh(); cout << q << r; }
};
int main()
{
A i(9, 7, 4);
B b(i, 3, 7);
b.sh();
}
推荐阅读
- sql - 显示特定字段的负值
- angular - 在 Angular 中,有没有办法拥有应用程序级工具栏,但在登录、注册等页面中却没有?
- c# - 没有注册类型的服务
- karate - 单击不使用组合框向下箭头按钮空手道 UI 测试
- angular - Angular 9 SSR - 我们可以为项目中的一个模块执行 SSR 吗?
- javascript - 使用 react-select 将值传递给状态
- bash - 在 bash 脚本中打印数组
- cassandra - 如何为 Apache Cassandra 编写自定义 Snitch?
- assembly - 数据溢出时标志寄存器中的 CF、OF
- php - PHP从字符串而不是字符中获取单词数