如何定义运算符

为了操作一个类的iterator,必须定义其相应的操作,(即运算符)
我们可以像定义member function一样来定义运算符。只需要在运算符前加上operator即可;

  1. class Triangular_iterator
  2. {
  3. public:
  4. Triangular_iterator(int index):_index(index-1){}
  5. bool operator==(const Triangular_iterator&) const;
  6. bool operator!=(const Triangular_iterator&) const;
  7. int operator*() const;
  8. Triangular_iterator& operator++();
  9. Triangular_iterator operator++(int);
  10. }

Triangular_iterator维护一个索引值,用来索引Triangular中存储数列元素的那个static data member_elem。为了达到这个目的,Triangular必须给Triangular_iterator的成员函数特殊的访问权限。这种机制可以通过friend机制来获得。
e.g.

  1. inline bool Triangular_iterator::
  2. operator==(const Triangular_iterator &rhs) const
  3. {return _index==rhs._index;}

定义运算符的规则

:::tips

  • 不可以引入新的运算符,(.,.*,::,?:四个运算符不可以被重载)
  • 运算符操作数个数不可变
  • 运算符优先级不可变
  • 运算符的参数列表中,至少一个是class类型!也就是说无法为指针之类的non-class类型定义已经存在的运算符。 ::: 运算符的定义方式可以像成员函数一样,也可以像非成员函数一样定义,不同的是非成员函数的定义时常常会引入this指针;

注意到在上例中,递增运算符有两种定义声明。这是因为递增运算符有着前置和后置两种版本
前置版本的参数列表是空的

  1. inline Triangular_iterator& Triangular_iterator::operator++()
  2. {
  3. ++_index;
  4. check_integrity();
  5. return *this;
  6. }

后置版本的参数列表也是空的(本应如此),但是按照重载的规则,参数列表要求独一无二,因此c++中用了一个int;该int函数由编译器自动为后置版的++产生,并且其值必为0,不需要用户烦恼;

  1. inline Triangular_iterator Triangular_iterator::operator++(int)
  2. {
  3. Triangular_iterator tmp=*this;
  4. ++_index;
  5. check_integrity();
  6. return tmp;
  7. }

嵌套类型

typedef可以将一个类型重新命名?
e.g.

  1. typedef Triangular_iterator iterator;