运算符重载
class Triangular_iterator
{
public://为了不要在每次访问元素的时候都执行-1操作//此处将_index的值设为index-1(就是贴合数组的逻辑次序)Triangular_iterator(int index):_index(index-1){}bool operator==(const Triagnular_iterator&)const;bool operator!=(const Triangular_iterator&)const;int operator*()const;Triangular_iterator& operator++(); //前置版Triangular_iterator operator++(int);//后置版//运算符重载
private:void check_integrity()const;int _index;
//如果两个Triangular_iterator对象的索引值(_index)相等
//这两个对象相等
inline bool Triangular_iterator::
operator==(const Triangular_iterator &rhs)const
{return _index==rhs._index
}//重载运算符后,可以直接用于类对象
if(trian1==trian2)//...//如果想将重载后的运算符作用于指针所指的类对象
//要先提领该指针,取出其所指对象
if(*ptri1==*ptri2)//...
//重载!=运算符
inline bool Triangular_iterator::
operator!=(const Triangular_iteragor &rhs) const
{return !(*this==rhs);
}
运算符重载的规则
- 不可以引入新的运算符:除了. .* :: ?:四个运算符,其他的运算符皆可被重载;
- 运算符的操作数个数不能变:二元运算符需要两个操作数,一元运算符需要一个操作数;
- 运算符优先级不可改变;
- 运算符函数的参数列表中,必须至少有一个参数为class类型:我们没法给比如指针这种非类类型重载运算符,也不能给它引进新运算符。
//重载运算符的运算符函数定义方式
inline int operator*(const Triangular_iterator)
{rhs.check_integrity();//如是一个非成员函数,就没有访问私有成员的权利return Triangular::_elems[_index];
}
非成员运算符的参表中,会比成员函数形式定义的运算符多出一个参数,即this指针(该this指针隐式代表左操作数)。
//递增运算符(++)的前置版本的重载
inline Triangular_iterator& Triangular_iterator::
operator++()
{//前置版本++_index;check_integrity();return *this;
}//递增运算符(++)的后置版本的重载
inline Triangular_iterator Triangular_iterator::
operator++( int )
{//后置版本Triangular_iterator tmp = *this;++_Index;check_integrity();return tmp;
}
嵌套类型
typedef可以为某个类型设定另一个不同的名称。
通用形式:typedef 内置类型/复合类型/class类型 new_name;
typedef Triangular_iterator iterator;iterator it=trian.begin();//错误
Triangular::iterator it=trian.begin();//正确Fibonacci::iterator ift=fib.begin();
Pell::iterator pit=pel.begin();
vector<int>::iterator vit=_elems.begin();
string::iterator sit=file_name.begin();