关于C++运算符重载程序输出137的疑问求解
咱们一步步拆解这段代码,你就能明白为什么(2+v).print()输出13而不是你算的10了——核心是你没注意到运算符重载的返回值会触发类的构造函数,这是关键的遗漏点!
第一步:初始化对象
V v(1,6) 类V的构造函数是V(int a =7, int b =3) { x = a + b; },所以当创建v时,x被赋值为1+6=7,这部分你已经理解,v.print()输出7完全正确。
第二步:分析
2 + v的执行流程 当执行2 + v时,因为左操作数是int类型,右操作数是V对象,所以会调用全局重载的运算符:
V operator+(int lop, V rop) { return rop + lop; }
这里的rop是v的副本(默认拷贝构造,直接复制v.x的值),所以rop.x初始为7。
第三步:调用成员运算符
rop + 2 接下来执行rop + lop(也就是rop.operator+(2)),对应类内的成员函数:
V operator+(int n) { return x++ + ++n; }
咱们拆解这个运算的细节:
x++是后置自增:先取当前rop.x的值(7),然后把rop.x改成8;++n是前置自增:先把参数n(也就是2)改成3,再取这个值;- 两者相加的结果是
7+3=10——到这里你的计算是对的,但重点在下一步!
最关键的一步:返回值触发构造函数
成员函数operator+返回的是V类型,所以编译器会把刚才算出的10作为构造函数的第一个参数a,第二个参数b用默认值3,于是新创建的V对象的x被赋值为:a + b = 10 + 3 = 13
所以(2+v)实际上是这个x=13的新对象,调用它的print()自然输出13。
为什么
v.print()还是7? 全局运算符里的rop是v的副本,成员函数里修改的是rop.x(变成8),原对象v的x从头到尾没被改动过,所以v.print()依然输出7。
内容的提问来源于stack exchange,提问作者brance
相关产品推荐
相关产品推荐

