c++ primer学习之----重载

来源:互联网 发布:淘宝怎么卖游戏装备 编辑:程序博客网 时间:2024/05/12 04:16
赋值(=)、下标([])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。

 

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;

}