我是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;
}
答案 0 :(得分:1)
问题不在于a
和b
都具有相同的值。因为他们没有。如预期的那样,调试器会向您显示a.all
为10,b.all
为15。
真正的问题是您将a
传递给one()
按值,因此编译器必须制作{strong>临时副本 { {1}}。这意味着编译器将使用您的复制构造函数复制构造a
(并在m
退出时销毁m
。因此,one()
值始终是递增的5值,而不是原始值。
在您的示例中,m.all
和b.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