为何能获取嵌套Pair对象的值却无法设置其值?
问题解析与解答
核心差异:值返回的临时对象特性
你的问题本质是值返回的临时对象的读写行为差异,拆解来看:
1. 获取操作可行的原因
当调用p2.getx()时,方法返回的是p2内部嵌套Pair对象的临时副本。这个副本是原对象的完整拷贝,所以它的成员值和原对象完全一致。此时调用副本的getx()/gety(),自然能拿到和原对象相同的结果——你读取的是临时副本的值,但因为副本和原对象初始状态一致,所以看起来和直接访问原对象效果一样。
2. 设置操作无效的原因
执行(p2.getx()).setx('c')时,同样先创建了临时副本,但你调用setx()修改的是这个临时副本的成员。临时副本的生命周期只在当前语句内,语句执行完毕后就会被销毁,p2内部的原嵌套对象根本没被触及,所以你的修改不会体现在原对象上,看起来就像“设置无效”。
解决方法
要直接修改原对象的内部成员,只需把getx()的返回类型改为引用,让方法返回原对象的别名而非副本:
template<typename T1, typename T2> class Pair { private: T1 x; T2 y; public: // 返回可修改的引用 T1& getx() { return x; } // 为const对象提供只读引用重载 const T1& getx() const { return x; } T2& gety() { return y; } const T2& gety() const { return y; } void setx(const T1& val) { x = val; } void sety(const T2& val) { y = val; } };
修改后,p2.getx()返回的是p2内部x成员的直接引用,后续调用setx()/sety()会直接修改原对象的成员,操作就能生效了。
内容的提问来源于stack exchange,提问作者UdayPalecha
相关产品推荐
相关产品推荐

