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