如何定义运算符
为了操作一个类的iterator,必须定义其相应的操作,(即运算符)
我们可以像定义member function一样来定义运算符。只需要在运算符前加上operator即可;
class Triangular_iterator{public:Triangular_iterator(int index):_index(index-1){}bool operator==(const Triangular_iterator&) const;bool operator!=(const Triangular_iterator&) const;int operator*() const;Triangular_iterator& operator++();Triangular_iterator operator++(int);}
Triangular_iterator维护一个索引值,用来索引Triangular中存储数列元素的那个static data member_elem。为了达到这个目的,Triangular必须给Triangular_iterator的成员函数特殊的访问权限。这种机制可以通过friend机制来获得。
e.g.
inline bool Triangular_iterator::operator==(const Triangular_iterator &rhs) const{return _index==rhs._index;}
定义运算符的规则
:::tips
- 不可以引入新的运算符,(
.,.*,::,?:四个运算符不可以被重载) - 运算符操作数个数不可变
- 运算符优先级不可变
- 运算符的参数列表中,至少一个是class类型!也就是说无法为指针之类的non-class类型定义已经存在的运算符。 ::: 运算符的定义方式可以像成员函数一样,也可以像非成员函数一样定义,不同的是非成员函数的定义时常常会引入this指针;
注意到在上例中,递增运算符有两种定义声明。这是因为递增运算符有着前置和后置两种版本
前置版本的参数列表是空的
inline Triangular_iterator& Triangular_iterator::operator++(){++_index;check_integrity();return *this;}
后置版本的参数列表也是空的(本应如此),但是按照重载的规则,参数列表要求独一无二,因此c++中用了一个int;该int函数由编译器自动为后置版的++产生,并且其值必为0,不需要用户烦恼;
inline Triangular_iterator Triangular_iterator::operator++(int){Triangular_iterator tmp=*this;++_index;check_integrity();return tmp;}
嵌套类型
typedef可以将一个类型重新命名?
e.g.
typedef Triangular_iterator iterator;
