我不知道为什么我的输出以“ 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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句