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

    技术2025-09-08  77

    赋值(=)、下标([])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。

     

    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;

    }

    最新回复(0)