复制构造函数实际上做了什么?

时间:2017-10-09 17:41:44

标签: c++ constructor copy-constructor

我是c ++编程的新手,我被困在两个成员都显示相同价值的部分。你能解释一下原因吗? Thx提前。

#include<iostream>

using namespace std;

class test{
  public:
    int all,sum;

    test(int x){
        all=x;
    }

    test(test &a){
        all=a.all+5;
        cout<<all;   
    }

    void one(test m){
        cout<<endl;
        cout<<endl<<m.all;
        cout<<endl<<all;
    }
};

int main(){
    test a(10),b(a);
    b.one(a);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题不在于ab都具有相同的值。因为他们没有。如预期的那样,调试器会向您显示a.all为10,b.all为15。

真正的问题是您将a传递给one() 按值,因此编译器必须制作{strong>临时副本 { {1}}。这意味着编译器将使用您的复制构造函数复制构造a(并在m退出时销毁m。因此,one()值始终是递增的5值,而不是原始值。

在您的示例中,m.allb.all只是的值是相同的值,只是因为它们都是从同一个{{1}复制构造的对象。尝试将m.all传递给a代替(b),您会看到one()将是20而不是15。

要解决您的问题,您需要更改b.one(b);以参考取其m.all参数

one()

这样,不需要临时副本。正如预期的那样,将m传递给void one(const test &m) { cout<<endl; cout<<endl<<m.all; cout<<endl<<all; } 将按原样输出a。正如预期的那样,将one()传递给a.all将按原样输出b。等等。

另外,在旁注中,您的复制构造函数也应该通过 const 引用获取其one()参数:

b.all