为什么我的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 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";
    }