赋值(=)、下标([])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。
6。操作符->
可以为类类型的对象重载成员访问操作符箭头(->),它必须被定义为一个类的成员函数。
假设我们想定义一个类类型来代表一个指向Screen类对象的指针,定义如下:
class ScreenPtr {
//...
private:
Screen *ptr;
};
我们希望定义ScreenPtr类,来保证这种类的对象总是指向Screen对象。它不能不指向对象。为了获得这种行为,我们定义一个带有构造函数的ScreenPtr类,但是它没有缺省构造函数
class ScreenPtr {
public:
ScreenPtr( Screen &s): ptr(&s){};
//...
}
ScreenPtr类型的对象的定义必须提供初始值:一个Screen类型的对象,ScreenPtr对象将指向它,否则定义就出错。
为使ScreenPtr类的行为像内置指针,我们必须在定义一些重载操作符,定义:解引用操作符(*)和成员操作符箭头(->):
class ScreenPtr {
public:
Screen& operator*() {return *ptr;}
Screen* operator->() { return ptr;}
//...
};
例程:
class Screen{
public:
Screen(short height = 0,short width = 0);
inline void home() { _cursor = 0; }
inline Screen& end();
inline Screen& forward();
inline Screen& back();
inline Screen& up();
inline Screen& down();
char lcFun(int){return 'a';};
private:
string _screen;
string::size_type _cursor;
short _height;
short _width;
inline int row();
};
class ScreenPtr{
public:
ScreenPtr(Screen &s){ptr = &s;}
Screen *operator->(){return ptr;}
Screen &operator*(){return *ptr;}
private:
Screen *ptr;
};
int main(int argc, char *argv[])
{
Screen screen(1,2);
ScreenPtr ptr(&screen);
cout<<ptr->lcFun(2)<<endl;
cout<<(*ptr).lcFun(2)<<endl;
return 0;
}