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