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

C++调用返回对象的方法再调用成员函数结果不一致问题

问题产生原因
  • 第一,selectObj 函数的形参采用值传递规则:当你传入test1、test2时,会自动生成两个和原对象完全独立的拷贝A、B,后续对A、B的所有操作都不会影响到原对象test1、test2。
  • 第二,selectObj 函数的返回值为值类型:返回时会再次基于A或者B生成一个临时的拷贝对象,你调用setNum(25)修改的只是这个生命周期极短的临时对象,语句执行完成后临时对象就会被销毁,原对象没有受到任何修改。

因此第二次调用selectObj拿到的仍然是原始test1的拷贝,x的值还是初始的10,和预期不符。

修复方案

核心思路是将参数和返回值都改为左值引用,全程不产生对象拷贝,直接操作原对象本身。修改后的selectObj函数代码如下:

// 注意返回值和参数都加了&表示引用
example& selectObj(example& A, example& B) {
    int selection;
    std::cout << "Select object 1 or 2: ";
    while (true) {
        std::cin >> selection;
        if (selection == 1)
            return A;
        else if (selection == 2)
            return B;
        else
            std::cout << "Invalid option, try again: ";
    }
}

修改后,selectObj返回的就是用户选中的原对象本身,调用setNum会直接修改原对象的成员值,两次都选1的情况下最终输出就是预期的25。

内容的提问来源于stack exchange,提问作者Jimmy Samson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:06:03