如何定义运算符
为了操作一个类的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;