You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

*this返回调用对象引用未生效?非成员函数实现对象相加结果不符合预期的问题咨询

问题分析与解决方案

首先明确:这不是类成员函数或*this指针的错误,问题出在你对add函数的设计以及调用后的处理上。

我们来拆解一下当前代码的执行流程:

  1. 你创建了num1和num2两个Person对象,都存入了值5。
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:32:45