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[] | + | - | * | / | % | ^ | & | | |
~ | ! | = | < | > | += | -= | *= | /= | %= | ^= | &= |
|= | << | >> | >>= | <<= | == | && | || | ++ | – | , | ->* |
() | [] | -> |