为什么我的C ++程序的副本构造函数被调用两次?

Wm 50

我不知道为什么我的输出以“ 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传递iinmain()分配给这是一个隐式副本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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的构造函数被两次调用

为什么在我的程序中两次调用构造函数?

为什么这个构造函数被调用两次?

为什么构造函数被两次调用

为什么析构函数被调用两次而构造函数仅被调用一次?

为什么 C++ 复制构造函数被调用两次?

为什么 C++ 复制构造函数被调用两次?

重写新运算符时,C ++类构造函数被调用两次-为什么

为什么析构函数被两次调用时我的程序不会崩溃

为什么我的 iOS 应用程序中的函数会被调用两次?

为什么类的构造函数被调用了四次,而在程序即将结束的时候,析构函数只被调用了两次?

为什么我的函数在React中被两次调用?

为什么我的 python 函数被调用两次?

ViewScope构造函数调用了两次,不确定为什么

为什么派生类可以调用基类构造函数两次?

为什么在下面的代码中两次调用了复制构造函数?

为什么在堆数组初始化中调用了两次复制构造函数?

为什么在这段代码片段中复制构造函数被调用了两次?

为什么在此链表实现中,此C ++构造函数在同一内存位置被调用两次?

为什么在 C++ 中重载后增量运算符会调用构造函数两次?

为什么在Java中两次使用构造函数

为什么该程序中的析构函数被调用两次?

在C ++中,移动构造函数是否被调用过两次?

为什么对象副本要构造和销毁两次?

为什么异步函数被调用两次?

为什么代码两次调用析构函数?

为什么析构函数被调用两次?

为什么析构函数调用两次表单?

为什么单击处理程序被调用两次