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:不可重载的操作符

. .* :: ?: new delete sizeof typeid static_cast dynamic_cast const_cast reinterpret_cast

表2:可重载的操作符

operator new operator delete operator new[] operator delete[] + - * / % ^ & |
~ = < > += -= *= /= %= ^= &=
|= << >> >>= <<= == && || ++ , ->*
() [] ->

猜你喜欢

转载自blog.csdn.net/zhizifengxiang/article/details/82958805
今日推荐