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
相关产品推荐
相关产品推荐

