【C++】class的设计与使用(六)运算符重载、嵌套类型(typedef)

运算符重载

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);
}

运算符重载的规则

  1. 不可以引入新的运算符:除了. .* :: ?:四个运算符,其他的运算符皆可被重载;
  2. 运算符的操作数个数不能变:二元运算符需要两个操作数,一元运算符需要一个操作数;
  3. 运算符优先级不可改变;
  4. 运算符函数的参数列表中,必须至少有一个参数为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();

你可能感兴趣的:(C++基础,c++,开发语言,笔记)