4 More Effective C++—条款7(切勿重载&&,||和逗号操作符)

1 &&,|| 和逗号操作符

1, && 和 || 操作符具有“短路”特征,即若操作符左侧操作数出现状况,右侧操作数便不会求值:
(1)&& 左侧操作数为false,右侧操作数不求值,整个表达式值为false。
(2)|| 左侧操作数为true, 右侧操作数不求值,整个表达式值为true。
2,逗号操作符“,”自左向右按顺序求值。如

for (int index =0, iter = 0; index < 100; ++index, ++iter) {
	;
}

2 重载带来的问题

首先,重载逻辑运算符会使“短路效果”消失,逻辑运算符两侧的操作数都会被求值。下面代码,两个表达式都会被求值。

if (express0 && express1) ....
// 变成如下两种形式
if (express0.operator&&(express1)) ....
if (operator && (express0, express1))......

其次,重载以后,用户无法规定表达式的求值顺序,而编译器的求值顺序也不可知,我们无法保证求值顺序是从左到右依次进行。因此对于如下的代码,可能会带来错误:

int number = 0;
number += 2, number *= 2;

3 可以重载的操作符

由上面讨论,我们可以看到,有些操作符是不能重载的。
表1:不可重载的操作符

..*::?:newdeletesizeoftypeidstatic_castdynamic_castconst_castreinterpret_cast

表2:可重载的操作符

operator newoperator deleteoperator new[]operator delete[]+-*/%^&|
~=<>+=-=*=/=%=^=&=
|=<<>>>>=<<===&&||++,->*
()[]->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值