7 不要重载&&、||和逗号运算符

C++允许许多运算符的重载,但能重载不是重载的理由。运算符重载目的是使程序更加可读、书写和理解,而不能违背原有的特性去迷惑他人。如果没有一个好的理解,不要去重载。

&&||运算符

C/C++在布尔表达式运算使用短路运算法:一旦确定了表达式的真假,不会运算剩下的表达式。如expression1 && expression2,当expresion1结果为falseexpression2不会被运算。

大多数程序员都知道这个特性,并利用这个特性编写代码:

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

7 不要重载&&、||和逗号运算符

上一篇:Dockerfile install miniconda


下一篇:DNS-基于Bind-dlz的智能DNS实现