You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:44:48