复制构造函数实际上做了什么?
我是新来的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;
}
的问题是不是都a
和b
具有相同的值。因为他们没有。如预期的那样,调试器会告诉你a.all
是10,b.all
是15。
真正的问题是,你是按值传递到a
one()
,所以编译器必须作出临时副本的a
。这意味着编译器将使用您的拷贝构造函数复制构造m
(并且当one()
退出时将销毁m
)。因此,m.all
值始终是一个递增5值,而不是原始值。
在您的例子中,b.all
和m.all
值只是发生是相同的值,不仅是因为它们都是拷贝构造从同一a
对象。尝试通过b
到one()
代替(b.one(b);
),你会看到m.all
将是20而不是15
为了解决您的问题,您需要更改one()
参照,而不是把它m
参数:
void one(const test &m) {
cout<<endl;
cout<<endl<<m.all;
cout<<endl<<all;
}
这样,不需要临时副本。如预期的那样,通过a
到one()
将按原样输出a.all
。如预期的那样,传递b
到one()
将按原样输出b.all
。等等。
此外,在一个侧面说明,你的拷贝构造函数应该由常量参考取其a
参数,以及:
test(const test &a){
all=a.all+5;
cout<<all;
}
Thx!但是,你能否向我解释一下这些价值观是如何平等的?我真的无法理解这部分。当b.one(a)被调用时会发生什么? –
@AshwinKumar:我更新了我的答案 –
你真的需要学习如何正确地格式化你的代码。此外,我建议每行只有一个声明/初始化,而不是多个变量。 – CoryKramer
复制构造函数可以做你想做的任何事情。通常,成员从另一个对象复制到* this *对象。 –
A *调试器*可以帮助您更快地回复此问题,而不是发布到StackOverflow并等待答案。 –