首页 > 解决方案 > 为什么我的 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();
}

标签: c++oopcopy-constructor

解决方案


您的复制构造函数被调用了 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();
}

推荐阅读