条款7:千万不要重载&&,||和,操作符

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sea_muxixi/article/details/84561919

1:&&和||操作符

C++和C对于"真假表达式"采用所谓的"骤死式"评估方式。

char *p;
if(p!=0 && strlen(p)>10)
...
int rangeCheck(int index)
{
    if(index < lowerBound || index > upBound )
    {
        return -1;
    }
}

上述内置的行为永远是从左往右评估表达式。

但是当你重载了&&或||时:

if(expression1 && expresion2) ...
会被编译器视为一下两者之一:
if(expression1.operator&&(expresion2))...
if(operator&&(expression1,expression2))...

上述函数有两个问题:1是函数只有参数正确了,才会被执行。

                                    2是不知道参数的评估顺序。

这与内置的骤死式评估法有一个鲜明的对比,所以请不要重载&&和||。

2:,操作符

表达式如果内涵逗号,那么逗号左侧会被先评估,然后右侧再评估,最后整个逗号表达式的结果以逗号右侧的值为代表。

当把操作符写成一个非成员函数,你绝对无法保证左侧表达式一定比右侧表达式更早评估。

当把操作符写成一个成员函数,你也无法保证左侧会先评估,因为编译器并不强迫做这样的事。

3.不能重载的操作符。

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

猜你喜欢

转载自blog.csdn.net/Sea_muxixi/article/details/84561919