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

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

问题描述:

我是新来的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

你真的需要学习如何正确地格式化你的代码。此外,我建议每行只有一个声明/初始化,而不是多个变量。 – CoryKramer

+0

复制构造函数可以做你想做的任何事情。通常,成员从另一个对象复制到* this *对象。 –

+2

A *调试器*可以帮助您更快地回复此问题,而不是发布到*并等待答案。 –

的问题是不是都ab具有相同的值。因为他们没有。如预期的那样,调试器会告诉你a.all是10,b.all是15。

真正的问题是,你是按值传递到aone(),所以编译器必须作出临时副本的a。这意味着编译器将使用您的拷贝构造函数复制构造m(并且当one()退出时将销毁m)。因此,m.all值始终是一个递增5值,而不是原始值。

在您的例子中,b.allm.all值只是发生是相同的值,不仅是因为它们都是拷贝构造从同一a对象。尝试通过bone()代替(b.one(b);),你会看到m.all将是20而不是15

为了解决您的问题,您需要更改one()参照,而不是把它m参数

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

这样,不需要临时副本。如预期的那样,通过aone()将按原样输出a.all。如预期的那样,传递bone()将按原样输出b.all。等等。


此外,在一个侧面说明,你的拷贝构造函数应该由常量参考取其a参数,以及:

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

Thx!但是,你能否向我解释一下这些价值观是如何平等的?我真的无法理解这部分。当b.one(a)被调用时会发生什么? –

+0

@AshwinKumar:我更新了我的答案 –