首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 编程交流与学习--More Effective C++的学习-Item M7:不要重载“&&”,“||”, 或“,”
【标  题】:编程交流与学习--More Effective C++的学习-Item M7:不要重载“&&”,“||”, 或“,”
【关键字】:--More,Effective,C++,-Item,M7
【来  源】:http://blog.csdn.net/swordll80/archive/2006/09/20/1255488.aspx

编程交流与学习--More Effective C++的学习-Item M7:不要重载“&&”,“||”, 或“,”

C一样,C++使用布尔表达式短路求值法(short-circuit evaluation)。这表示一旦确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算。例如:char *p;… if ((p != 0) && (strlen(p) > 10)) …

C++允许根据用户定义的类型,来定制&&||操作符。方法是重载函数operator&& operator||,你能在全局重载或每个类里重载。然而如果你想使用这种方法,你必须知道你正在极大地改变游戏规则。因为你以函数调用法替代了短路求值法。首先当函数被调用时,没有采用短路计算法。第二是C++语言规范没有定义函数参数的计算顺序,所以没有办法知道表达式1与表达式2哪一个先计算。完全可能与具有从左参数到右参数计算顺序的短路计算法相反。

    因此如果你重载&&||,就没有办法提供给程序员他们所期望和使用的行为特性,所以不要重载&&||

    同样的理由也适用于逗号操作符,一个包含逗号的表达式首先计算逗号左边的表达式,然后计算逗号右边的表达式;整个表达式的结果是逗号右边表达式的值。

    如果你想大胆地写自己的逗号操作符函数。不幸的是你无法模仿。  如果你写一个非成员函数operator()你不能保证左边的表达式先于右边的表达式计算,因为函数(operator,)调用时两个表达式做为参数被传递出去。但是你不能控制函数参数的计算顺序。

还有什么不能重载的呢?正如显示的,存在一些限制,你不能重载下面的操作符:

.              .*              ::             ?:

new          delete        sizeof      typeid

static_cast  dynamic_cast  const_cast  reinterpret_cast

你能重载:

operator new        operator delete

operator   new[]    operator delete[]

+    -   *   /   %   ^     &   |     ~

!    =   <   >  +=   -=   *=   /=   %=

^=  &=  |=  <<  >>   >>=  <<=  ==   !=

<=  >=  &&  ||  ++   --    ,   ->*  ->

()  []

当然能重载这些操作符不是去重载的理由。操作符重载的目的是使程序更容易阅读,书写和理解,而不是用你的知识去迷惑其他人。如果你没有一个好理由重载操作符,就不要重载。在遇到&&, ||, ,时,找到一个好理由是困难的,因为无论你怎么努力,也不能让它们的行为特性与所期望的一样。 
编程交流与学习--More Effective C++的学习-Item M8:理解各种不同含义的new和delete:【上一篇】
编程交流与学习--More Effective C++的学习-Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别:【下一篇】
【相关文章】
  • 编程交流与学习--More Effective C++的学习-Item M8:理解各种不同含义的new和delete
  • GUI of C++
  • 编程交流与学习--More Effective C++的学习-Item M9:使用析构函数防止资源泄漏
  • 在VC++6.0 SP6 下配置ICE工程[DEBUG版本]--config ice project(debug) for vc++6.0 with sp6
  • c++Builder 像素操作[原创]
  • 用C++ Builder对图像进行特殊效果处理[转载]
  • 关于 eclipse 3.2 下 开发 C++ 应用程序。
  • Ineffective C++(1):STL容器不仅仅可以保存指针
  • 体验C++中接口与实现分离的技术
  • How to Use Eclipse for C and C++ Development
  • 【随机文章】
  • 核态获取PsLoadedModuleList地址的稳定方法
  • 用EasyMailObject组件处理Exchange邮件源代码(7)
  • Solaris下也能用ISO文件
  • 编码问题
  • 修复引导记录
  • 加强MySQL服务器的安全性
  • 防火墙:是关键控制还是全网服务
  • 网络安全产品技术发展趋势(2)
  • Business Process Modeling and Simulation with UML
  • 5 Jive的其他组件技术2
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.