*this返回调用对象引用未生效?非成员函数实现对象相加结果不符合预期的问题咨询
问题分析与解决方案
首先明确:这不是类成员函数或*this指针的错误,问题出在你对add函数的设计以及调用后的处理上。
我们来拆解一下当前代码的执行流程:
- 你创建了
num1和num2两个Person对象,都存入了值5。 - 调用
add(num1, num2)时,函数接收的是两个const引用参数:- 函数内部创建了
Ldata(也就是num1)的副本DataSum - 调用
DataSum.combine(Rdata)把num2的值加到了DataSum的value_capture上,这时候DataSum的值确实是10 - 最后返回这个
DataSum对象,但你在main里没有把这个返回值赋值给任何变量,所以num1本身完全没被修改,还是原来的5。
- 函数内部创建了
两种可行的修正方案
方案1:接收add函数的返回值
如果你希望保留add函数返回新对象的设计,只需要在调用时把返回值赋值给num1即可:
int main(){ Person num1 ; Person num2 ; num1.InValueCapture(5) ; num2.InValueCapture(5) ; num1 = add(num1,num2); // 把相加后的新对象赋值给num1 cout << "THE OUTPUT : " << num1.GetValueCapture() << endl; // 此时输出为10 return 0 ; }
方案2:让add函数直接修改第一个参数
如果你希望add函数直接修改传入的num1,可以修改add函数的参数和实现:
// 修改后的add函数:第一个参数改为非const引用 void add(Person &Ldata , const Person &Rdata) { Ldata.combine(Rdata); // 直接调用Ldata的combine方法修改它本身 }
这样调用add(num1, num2)后,num1的value_capture就会直接变成10,不需要额外赋值,main里的输出就能得到预期结果。
另外补充一下:你的combine成员函数和*this指针是完全正确的——combine里的*this指向的是调用该方法的对象(方案1里是DataSum,方案2里是Ldata也就是num1),它正确地修改了对象自身的value_capture值。
内容的提问来源于stack exchange,提问作者KOO CHEN FENG
相关产品推荐
相关产品推荐

