设为首页 加入收藏

TOP

4.8 operators
2013-10-07 15:01:18 来源: 作者: 【 】 浏览:63
Tags:4.8 operators

4.8  operators

C++(www.cppentry.com)提供了操作符重载的能力,可以把大多数操作符重新定义为函数,使对对象的操作更加简单直观。这方面很好的例子就是标准库中的string和complex,可以像操作内置类型int、double那样对它们进行算术运算和比较运算,非常方便。

但实现重载操作符却比使用它要麻烦许多,因为很多运算具有对称性,如果定义了operator+,那么很自然需要operator-,如果有小于比较,那么也应该有小于等于、大于、大于等于比较。完全实现这些操作符的重载工作是单调乏味的,而且增加的代码量也增加了出错的可能性,还必须保证这些操作符都实现了正确的语义。

实际上,很多操作符可以从其他的操作符自动推导出来,例如a!=b可以是!(a==b),a>=b可以是!(a<b)。因此原则上只需要定义少量的基本操作符,其他的操作符就可以用逻辑组合实现。

C++(www.cppentry.com)98标准的std::rel_ops名字空间里提供了四个模板比较操作符!=、>、<=、>=,只需要为类定义了==和<操作符,那么这四个操作符就可以自动实现。

例如:

  1. #include <utility> 
  2. class demo_class                                //一个定义operator<的类  
  3. {  
  4. public:  
  5.     demo_class(int n):x(n){}  
  6.     int x;  
  7.     friend bool operator<(const demo_class& l, const demo_class&r)  
  8.     {   return l.x < r.x;   }  
  9. };  
  10. int main()  
  11. {  
  12.     demo_class a(10), b(20);  
  13.     using namespace std::rel_ops;               //打开std::rel_ops名字空间  
  14.     cout << (a<b<<endl;                       //自定义的<操作符  
  15.     cout << (b>=a) << endl;                     //>=等操作符被自动实现  
  16. }  

但std::rel_ops的解决方案过于简单,还很不够。除了比较操作符,还有很多其他的操作符重载标准库没有给出解决方案,而且使用这些操作符需要用using语句导入std::rel_ops名字空间,不方便,也会带来潜在的冲突风险。

boost.operators库因此应运而生。它采用类似std::rel_ops的实现手法,允许用户在自己的类里仅定义少量的操作符(如<),就可方便地自动生成其他操作符重载,而且保证正确的语义实现。

operators位于名字空间boost,为了使用operators组件,需要包含头文件<boost/ operators. hpp>,即:

  1. #include <boost/operators.hpp> 
  2. using namespace boost; 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.7.1 类摘要 下一篇4.9.1 标准库中的异常

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: