C++箭頭操作符重載(記錄下,備忘)

最近由於工作,學習了下箭頭操作符,好複雜的說,過了沒幾天就忘了,又學了一遍。

同時決定,這裏記錄下,備忘!

(這裏的內容,參考了C++primer ,加上了些我自己的整理)

箭頭操作符,一般都有左右兩部分:a->b;(其中,b可以是函數或者成員;)

如何開始:由a開始,分下面兩種情況

1、a是指針,那麼就是我們熟悉的,指向我們a類型的成員數據或函數“b”到這裏,就結束了!

2、a是對象,那麼a必須有成員函數"operator->"(否則會報錯)。那麼就調用a的operator->函數。由於operator->返回的可能是指針,也可能是對象,那麼就又進入了下一輪遞歸:是指針還是對象,走1或2,如此遞歸。

如何結束:不管a是指針或者對象,最終都是走到指針結束(當然,寫錯了也走不下去)。

下面是我寫的一個例子,有助於理解!


#include <iostream>
#include <stdlib.h>

using namespace std;

class D
{
public :
    void Print(){cout<<"I am in class D!"<<endl;}
};

class C
{
public :
    void Print(){cout<<"I am in class C!"<<endl;}
    D* operator->(){return &m_d;}
private :
    D m_d;
};

class B
{
public :
    void Print(){cout<<"I am in B!"<<endl;}
    C &operator ->(){return m_c;}
private :
    C m_c;
};

class A
{
public :
    void Print(){cout<<"I am in A!"<<endl;}
    C *operator ->(){return &m_c;}
private :
    C m_c;
};    



int main(int argc, char *argv[])
{
    A a;
    a->Print();                  //"I am in class C!";
    a->operator->()->Print();    //"I am in class D!"
    B b;
    b->Print();                  //"I am in class D!"

    system("PAUSE");	
    return 0;
}

如上代碼:

1、a->Print();    那麼,首先,a是對象,而且有operator->,調用之,返回C*,是個指針。那麼,接下來就是調用函數Print,找到對應的C的成員函數。

2、a->operator->()->Print(); 同上,a調用“->”返回的C*,是個指針;那麼接下來就是調用C的成員函數。後面是個operator->(),正好是C的一個成員函數。C的operator->返回的是D*,是個指針,那麼再調用對應的D的成員函數——Print(); 即“a->operator->()->Print()”中的operator->()需要看成一個C的成員函數(正好返回D*,可以調用箭頭“->”)就好理解了。

3、b->Print();   b是對象,調用operator->返回C對象,那麼需要再次遞歸——C是對象,調用operator->返回D*,那麼就是指針,可以走向結束:調用對應的函數Print。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章