Chinaunix首页 | 论坛 | 博客
  • 博客访问: 713239
  • 博文数量: 102
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1748
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-23 15:42
个人简介

寻找严肃、沉默和专注的力量。

文章分类

全部博文(102)

文章存档

2015年(26)

2014年(8)

2013年(68)

分类: C/C++

2013-07-10 16:44:12

选择成员或非成员实现
   为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序员没有选择,操作符必须是成员;在另一些情况下,有些经验原则可指导我们做出决定。下面是一些指导原则,有助于决定将操作符设置为类成员还是普通非成员函数:
   1.赋值(=)、下标([])、调用(())和成员访问箭头(->等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。
   2.像赋值一样,复合赋值操作符通常定义为类的成员,与赋值不同的是,不一定非得这样做,如果定义为非成员复合赋值操作符,不会出现编译错误。
   3.改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减和解引用,通常就定义为类成员。
   4.对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。

下面给出一些说明:

   重载操作符一般定义如下
   class Example {
       friend std::istream& operator>>(std::istream&, Example&);
       friend std::ostream& operator<<(std::ostream&, const Example&);

   public:
       Example& operator+=(const Example&);

       int num;
   };
       Example operator+(const Example&, const Example&);
   赋值操作符
因为赋值返回一个引用,所以不需要创建和撤销结果的临时副本,返回值通常是左操作数的引用
   Example& Example::operator+=(const Example& rhs)
   {
       num += rhs.num;
       return *this;
   }

   标操作符    
   class Foo {

   public:
       int &operator[] (const size_t);
       const int &operator[] (const size_t) const;

    private:
       vector data;
   };
   如下实现:(未做范围检测)
   int& Foo::operator[] (const size_t index)
   {
       return data[index];
   }

   const int& Foo::operator[](const size_t index) const
   {
       return data[index];
   }

   前自增自减操作符
为了与内置类型一致,前缀式操作符应返回被增量或减量对象的引用
   Example& operator++();
   Example& operator--();

   后自增自减操作符
为了与内置类型一致,后缀式应返回旧值,并作为值返回,而不是引用,参数用于区分后置,并没有其他意义。
   Example operator++(int);
   Example operator--(int);

   IO操作符必须为非成员函数
当定义符合标准库iostream规范的输入或输出操作符的时候,必须使它成为非成员操作符,否则左操作数将只能是该类类型的对象:
   //如果 操作符 << 是 Example的成员
   Example exp;
   exp << cout;
显然这个用法与正常的使用方式相反
    输出操作符
为了与IO标准库一致,操作符应接受ostream& 作为第一个形参,对类类型const对象的引用作为第二个形参,并返回对ostream形参的引用
   ostream& operator<<(ostream& os, const Example& e)
   {
       os << e.num;
       return os;
   }

   输入操作符(未做输入检测)
   istream& operator>>(istream& in, Example& e)
   {
       in >> e.num;
       return in;
   }

阅读(3135) | 评论(0) | 转发(1) |
0

上一篇:auto_ptr浅析

下一篇:boost实用工具noncopyable

给主人留下些什么吧!~~