问题描述
我不知道为什么我的输出以“ ACCB ..”开头-我的期望是“ ACB ..”
#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 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
参数正在通过值传递。将i
中的main()
分配给x
时,将进行隐式复制。然后,当将x
传递给a
的{{1}}成员的副本构造函数时,将创建显式副本。
您可以通过更改B
参数来代替隐式副本,该参数将通过引用传递 。
此外,您的x
副本构造函数应声明为A
。
A(const A& a)
,
为什么类A的副本构造函数被调用两次?
因为您的B
构造函数采用第一个参数(class A
的 object ) 按值 -复制i
,然后将其传递给构造函数。
为防止这种情况,请将B
构造函数的第一个参数声明为引用(如A
复制构造函数本身一样):
B(A& x,int y,int z) : a(x),q(y),r(z)
{
cout << "B";
}