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->()返回结果
    • 如果返回类型是指针,则解引用调用成员
    • 否则,递归调用->操作符,如果编译器检查到其没有成员箭头,则递归错误

转载于:https://www.cnblogs.com/qinjunni/archive/2011/10/16/2213898.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值