zoukankan      html  css  js  c++  java
  • 7. 千万不要重载&& ,|| 和,操作符

    C/C++语言对于逻辑表达式具有“逻辑短路”的性质,即一旦确定了真假值,表达式中即使有尚未检查的部分,都将返回。如:

    
    
    char *p;
    if ((p != NULL) && printf("%c", *p)) ...                     //(1)
        
    int rangeCheck(int index)
    {
        if ((index < lowerBound) || (index > upperBound)) ...    //(2)
        ...
    }

    (1)中你不用担心p为NULL时,调用printf函数会出现错误,因为一旦p为NULL逻辑与的检测将返回FASLE,无需计算后面的部分。

    (2)中检查下标值是否越界,你也不用担心如果index已经越下界还会与上界进行比较,因为前者正确之后即返回TRUE,无需计算后者。

    当我们进行重载&&和||时,我们也希望具有上面的性质。但事与愿违,多数情况是无法达到这种要求。如我们将operator &&重载,当我们写出如下的表达式:

    if (expression1 && expresssion2)    ...
    
    //编译器会视作:
    
    if (expression1.operator&&(expression2))   ...          //operator&& 是member-function
    
    //或者
    
    if (operator&&(expression1, expression2))  ...          //operator&& 是global-function

    上面两种形式,都会将计算expression1和expression2的值,而且计算的顺序也不确定,这样就违背了之前谈论的“逻辑短路”现象。

    逗号(,)操作符的含义,是从左到右依次计算每个表达式的值,最后返回的是最后一个表达式的值,如

    expression1, expression2, ..., expressionN;

    将依次计算expression1,expression2,...的值,最后返回值为expressionN的值。

    现在我们重载逗号(,)操作符,如果是以global-function形式给出,我们无法确保参数的计算顺序是从左到右的;如果以member-function形式给出,仍不能保证逗号操作符的左操作数先被计算。因此,不能确保完成逗号操作符所期望的功能。

    现总结C++语言中不能重载的操作符有:

    .            .*             ::           ?:
    
    new          delete         sizeof       typeid
    
    static_cast  dynamic_cast   const_cast   reinterpret_cast
    可以重载的操作符有:
    operator new      operator delete
    
    operator new[]    operator delete[]
    
    +   -   *   /   %   ^   &   |   ~
    
    !   =   <   >   +=  -=  *=  /=  %=
    
    ^=  &=  |=  <<  >>  >>= <<= ==  !=
    
    <=  >=  &&  ||  ++  --  ,   ->*  ->
    
    () [] 
     
    参考文献: 《More Effective C++ 35个改善编程与设计的有效方法 中文版》
     
  • 相关阅读:
    bash帮助文档简单学习;bash手册翻译
    jmeter的master、slave模型启动方法
    如何查看pip安装包的所有版本;以及ipython的安装
    简单过下bash/sh脚本基本知识吧
    Celery 启动报错 can_read() got an unexpected keyword argument timeout
    paramiko执行命令超时的问题
    远程的jmeter自动执行完,如何回调通知被调用者“结束”状态
    记录一下:关于mysql数据误删除恢复的问题
    数据库Sharding的基本思想和切分策略
    数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
  • 原文地址:https://www.cnblogs.com/hazir/p/2452068.html
Copyright © 2011-2022 走看看