【问题标题】:Why is my C++ program's copy constructor called twice?为什么我的 C++ 程序的复制构造函数被调用了两次?
【发布时间】:2020-09-06 18:31:11
【问题描述】:

我不明白为什么我的输出以“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++ 默认是按值复制。

标签: c++ oop copy-constructor


【解决方案1】:

您的复制构造函数被调用了 2 次,因为您正在制作 2 个副本。 1 是由编译器隐式生成的,1 是在你自己的代码中显式生成的。

在您的B 构造函数中,它的x 参数正在按值传递。这是在将main() 中的i 分配给x 时进行的隐式复制。然后,当x 被传递给Ba 成员的复制构造函数时,会进行显式复制。

您可以通过将x 参数更改为通过引用传递来消除隐式副本。

另外,您的A 复制构造函数应声明为A(const A&amp; 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();
}

【讨论】:

    【解决方案2】:

    为什么A类的拷贝构造函数被调用了两次?

    因为您的 B 构造函数采用其第一个参数(class A对象按值 - 所以是 @ 的副本生成 987654323@,然后传递给构造函数。

    为防止这种情况发生,请将B 构造函数的第一个参数声明为引用(就像在A 复制构造函数本身中一样):

        B(A& x, int y, int z) : a(x), q(y), r(z)
        {
            cout << "B";
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2013-01-12
      • 2023-03-30
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多