C++调用方法返回对象后setNum修改属性值不生效结果不一致问题
问题原因与修复方案
核心问题原因
你遇到的问题本质是C++的值传递语义导致操作的始终是原对象的拷贝,未修改原对象,具体拆解如下:
- 你的
selectObj函数的入参A、B为值类型,调用时会对传入的test1、test2做一次拷贝,函数内部持有的已经是独立的副本,和原对象无关 selectObj的返回值也是值类型,返回时会再对内部的A/B拷贝生成临时对象,你调用setNum(25)修改的是这个临时对象的值,调用结束后临时对象立即销毁,全程没有触及原test1对象- 第二次调用
selectObj时传入的仍是未修改的原test1,读取到的自然还是初始值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: "; } }
修改后两次选择1时,setNum会直接修改原test1的x值,第二次调用getNum就能读到25,符合预期。
内容的提问来源于stack exchange,提问作者Sxivy
相关产品推荐
相关产品推荐

