c++重载操作符

#include <iostream>
using namespace std;

class Screen{
	  
};

class CheckedPtr{
public:
	// 没有默认构造函数
	CheckedPtr(Screen* b,Screen* e):beg(b),end(e),curr(b){}

	//解引用操作符 *
	Screen& operator*();
	const Screen& operator*() const;

	//下标操作符
	Screen& operator[](const size_t);
	const Screen& operator[](const size_t) const;

	//前缀自增/自减操作符 返回引用 ++/--
	CheckedPtr& operator++();
	CheckedPtr& operator--();

	//后缀自增/自减 返回值,而不是 返回引用 ++/--
	CheckedPtr operator++(int);
	CheckedPtr operator--(int);

	//重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己箭头操作符的类类型对象(递归调用箭头操作符,直到返回指针) ->
	Screen* operator->();
	const Screen* operator->()const;
private:
	Screen *beg;
	Screen *end;
	Screen *curr;
};

Screen& CheckedPtr::operator*(){
	if(curr==end)
		exit(1);
	else
		return *curr;
}

const Screen& CheckedPtr::operator*()const{
	if(curr==end)
		exit(1);
	else
		return *curr;
}

Screen& CheckedPtr::operator[](const size_t index){
	if(beg+index>=end||beg+index<=beg)
		exit(1);
	return *(beg+index);
}

const Screen& CheckedPtr::operator[](const size_t index)const{
	if(beg+index>=end||beg+index<=beg)
		exit(1);
	return *(beg+index);
}

CheckedPtr& CheckedPtr::operator++(){
	if(curr==end)
		exit(1);
	++curr;
	return *this;
}

CheckedPtr& CheckedPtr::operator--(){
	if(curr==end)
		exit(1);
	--curr;
	return *this;
}

CheckedPtr CheckedPtr::operator++(int){
	CheckedPtr ret(*this);
	++*this;
	return ret;
}

CheckedPtr CheckedPtr::operator--(int){
	CheckedPtr ret(*this);
	--*this;
	return ret;
}

Screen* CheckedPtr::operator->(){
	return curr;
}

const Screen* CheckedPtr::operator->()const{
	return curr;
}


 

这里尤其要注意的是重载箭头操作符,举个例子:point->action(),编译器处理工作如下:

  • 如果point是个指针,则编译器对指针解引用,并从结果对象获取指定成员,如果该对象没有定义该成员,则编译器产生一个错误
  • 如果,point不是一个指针,则编译器先调用->箭头操作符,先从point->()返回结果
    • 如果返回类型是指针,则解引用调用成员
    • 否则,递归调用->操作符,如果编译器检查到其没有成员箭头,则递归错误

posted on 2011-10-16 10:29  一指流砂  阅读(828)  评论(0编辑  收藏  举报

导航