C++重载后置自增运算符时,执行(this->x)=(this->x)++后x值为何未自增
问题根本原因
1. 当前示例程序未触发重载逻辑
你给出的代码里,main函数仅完成了类对象初始化、调用showData()的操作,全程没有写出t1++这类触发后置自增重载的调用语句,因此operator++(int)函数内部的所有代码都不会执行,类成员x自然保持初始化值9,不会发生变化。
哪怕你手动加上t1++;触发这个重载函数,函数内部写的(this->x)=(this->x)++;语句本身也存在语法逻辑问题,依然无法实现x自增到10的预期效果。
2. 自赋值语句的语法行为不符合预期
this->x = this->x++这类写法的表现,本质是C++内置后置自增的语义和表达式求值规则导致的:
- C++内置的后置
++的核心逻辑是:先返回变量自增前的旧值临时副本,对原变量做自增是附带的副作用,这个副作用的生效时机和同表达式内的赋值操作没有强制的执行顺序约束。 - 拆解这个表达式的执行流程:
- 执行后置
++时,会先捕获x的当前值9作为返回值,再启动x自增1的副作用流程; - 紧接着执行赋值操作,把刚才捕获的旧值9重新写回x的存储位置;
- 由于没有明确的序列点约束两个操作的先后,绝大多数编译器的实现会让赋值操作直接覆盖掉后置自增带来的修改,最终x的值回到初始的9,完全看不到自增效果。
- 执行后置
- 这个行为和单独写
int a=9; a = a++;的表现完全一致,后者在绝大多数编译器下执行完a的值依然是9。
正确的重载写法
要实现预期的自增效果,需要去掉冗余的自赋值逻辑,直接对成员执行自增即可:
void operator++ (int){ // 直接执行成员自增,不要嵌套自赋值 this->x++; cout << "Value of x is" << x <<endl; }
如果要完全符合后置自增的标准语义,还需要在自增前保存旧值,将旧值作为函数返回值返回,和内置类型的后置自增行为保持一致。
内容的提问来源于stack exchange,提问作者loveofprogramming
相关产品推荐
相关产品推荐

