More Effective C++ 条款07:千万不要重载&&,||和,操作符

C++对于“真假表达式”采用所谓的骤死式评估方式。意思是一单该表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍高结束。举例:

char *p;
...
if((p != 0) && (strlen(p) > 10))

你无需担心调用strlen时p是否为null指针,因为如果"p是否为0"的测试结果是否定的,strlen就绝不会被调用。同样道理,以下代码:

int rangeCheck(int index)
{
    if((index < lowerBound) || (index > upperBound))...
    ...
}

如果index小于lowerBound,它就绝对不会被拿来和upperBound比较。

如果你为自定义类重载&&和||操作符,你将从根本层面改变整个游戏规则,因为从此“函数调用语义”会取代“骤死式语义”。

if(expression1 && expression2)...

会被编译器视为以下两者之一:

//假设operator&&是成员函数
if(expression1.operator&&(expression2))

//假设operator&&是全局函数
if(operator&&(expression1, expression2))

函数调用语义和所谓骤死式语义有两个重大的区别。第一,当函数调用动作被执行,所有参数值都必须评估完成,所以当我们调用operator&&和operator||时,两个参数都已完成评估。第二,C++语言规范并未明确定义函数调用动作各参数的评估顺序,所以没办法知道expression1和expression2哪个会先被评估。而骤死式总是由左向右评估其自变量。所以请不要重载&&和||。

逗号操作符原理跟上面一样。

你可能感兴趣的:(More,Effective,C++,c++,开发语言)