C++类型转换运算符中如何修改调用对象的字段状态?
类型转换运算符中修改原对象字段状态的方法
问题背景
给类编写类型转换运算符时,想要修改发起转换操作的对象的字段状态,但实际运行后字段并未发生预期变化。
核心疑问
如何在类型转换运算符中修改发起转换的对象的字段状态?
示例代码
#include <iostream> class myClass { public: int field; int res; myClass() { field = 0; res = -1; } operator bool() { field = 0; return static_cast<bool>(res); } myClass operator>(int val) { if (field > val) { res = 1; } else { res = 0; } return *this; } }; int main() { myClass example; example.field = 10; bool conRes = static_cast<bool>(example > 5); return 0; }
问题现象
执行上述代码后,example对象的field字段并未被修改为0。通过打印对象地址验证发现,类型转换运算符中操作的是对象副本,而非原对象:
test add before cast: 0000000A7BAFF6C8 test add bool() cast: 0000000A7BAFF7C4 test add after cast: 0000000A7BAFF6C8
问题原因与解决办法
原因分析
问题出在两个关键环节:
operator>运算符返回的是对象副本,而非原对象的引用。example > 5会生成一个临时对象,后续的类型转换操作仅作用于这个临时副本,修改的是副本的字段,原对象example完全不受影响。- 虽然
operator bool()本身具备修改字段的能力,但它操作的是临时副本,自然无法改变原对象的状态。
解决办法
只需要修改operator>的返回值类型为引用类型即可:
myClass& operator>(int val) { if (field > val) { res = 1; } else { res = 0; } return *this; }
修改后,example > 5返回的是原对象example的引用,后续的static_cast<bool>会直接操作原对象,operator bool()里对field的修改就能成功作用到原对象上。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

