C++允许许多运算符的重载,但能重载不是重载的理由。运算符重载目的是使程序更加可读、书写和理解,而不能违背原有的特性去迷惑他人。如果没有一个好的理解,不要去重载。
&&
和||
运算符
C/C++在布尔表达式运算使用短路运算法:一旦确定了表达式的真假,不会运算剩下的表达式。如expression1 && expression2
,当expresion1
结果为false
,expression2
不会被运算。
大多数程序员都知道这个特性,并利用这个特性编写代码:
void function(char * str)
{
if((str != NULL) && (strlen(str) > 10) {...}
}
通过短路运算特性,当str
为空时,不会运算strlen(str)
表达式。
C++允许重载&&
及||
运算符,布尔表达式将作为重载函数参数。
expression1 && expression2;//代码
//相当于...
expression1.operator&&(expression2);//成员&&重载函数
operator&&(expression1 && expression2);//全局&&重载函数
函数被调用时,其的所有参数都会被运算,顺序从右到左,没有使用短路运算法。
重载&&
和||
无法实现程序员期望的短路运算特性,所以不应重载&&
和||
运算符。
逗号表达式
逗号表达式用户将多个子表达式组成单个表达式。从左到右逐个运算子表达,并将最后一个子表达式作为逗号表达式的值。
通过重载函数重载逗号运算符,子表达式作为函数参数,并不能控制函数参数的运算顺序,因而无法还原逗号表达式的运算特性。
其它运算符
《MECPP》同时标识了其它不能重载的运算符:
. |
.* |
:: |
?: |
---|---|---|---|
new |
delete |
sizeof |
typeid |
static_cast |
dynamic_cast |
const_cast |
reinterpret_cast |