07. 千万不要重载&&、||和, 操作符

为什么不能重载&&、||
对于&&和||操作符,存在"骤死式"评估方式
例如if (expression1 && expression2),如果expression1为false,不会计算expression2。
对于if (expression1 || expression2),如果expression1 为true,不会计算expression2。

重载&&和||操作符,将从根本上改变这个规则,因此从此"函数调用"会取代"骤死式语义"。
对于式子:
if (expression1 && expression2) …会被编译器视为 if (expression1.operator && (expression2)).… // 成员函数版本
或者
if (operator && (expression1, expression2) … // 全局函数版本

这种函数调用语义骤死式语义截然不同。
首先,当函数调用动作被执行时,所有参数都必须评估我拿出,所以当我们调用operator&&和operator||时,两个参数都已评估完成,也就是没有了骤死式语义。
其次,C++语言规定并未明确定义函数调用中各参数的评估顺序,所以没办法直到expression1和expression2那个先被评估。
这与骤死式评估行程一个明确的对比,后者总是由左向右评估器自变量。

所以,如果将&&或者||重载,就没有办法提供预期的某种行为模式。

为什么不能重载逗号表达式
对于逗号表达式,逗号左侧会先被评估,然后逗号的右侧再被评估;最后,这个表达式的结果以逗号右侧的值为代表。
如果重载了逗号表达式,无法保证左侧表达式会比右侧表达式先被评估,编译器无法做出保证。

哪些不能被重载:
.、.*::?:newdeletesizeoftypeif
static_castdynamic_castconst_castreinterpret_cast

哪些操作符可以被重载:
其他的都行

总结:
允许重载的操作符,就可以进行重载,但是不能忘记重载的目的,是为了让程序更容器被阅读、被撰写、被理解。
如果没有好的理由重载某个操作符,就不要重载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值