成員訪問(->)操作符的重載

源地址:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28662931&id=3498450

(參考了C++primer)

      箭頭(->)操作符,看起來很像二元操作符,左操作數是類對象,右操作數是類成員,即使如此,箭頭操作符的重載函數是沒有第二個形參的(第一個是隱含形參this),理解起來有點難度;

  函數語句爲:

    a->b;(其中,b可以是函數或者成員;)

    步驟1. 如果a是指針,指向一個具有成員b的類對象,那麼a->b返回a類型的成員b,至此,語句結束;

    步驟2. 如果a是一個對象(對象必須重定義了“operator->”,否則報錯),那麼就調用a的operator->()函數,返回值:如果是指針則繼續執行步驟1,如果是對象則繼續執行步驟2,直到最終走到指針結束。

實例:


#include   
#include   
  
using namespace std; 

class A
{
   public:
     void Printf() {cout << "I am A " << endl;}
};
class B
{
   public:
      void Printf() {cout << "I am B " << endl;}
      A* operator->() { return &m_A;}
   private:
     A m_A;
};
class D
{
   public:
     void Printf() {cout << "I am C " << endl;}
     B* operator->() { return &m_B; }   // 返回(&m_B)的解引用
   private:
     B m_B;
};
class E
{
   public:
      void Printf() {cout << "I am E " << endl;}
     B& operator->() { return m_B; }      // 返回 m_B 的引用
   private:
        B m_B;
};
int main()
{
 D d;
 d->Printf();                                    //  I am B
 d.operator->()->Printf();                //  I am B
 d->operator->()->Printf();            //  I am A
 E e;
 e->Printf();            //  I am A
 return 1;
}

解析:

1.  d->Printf();   d是對象,執行d的“opterator->()" 成員函數,函數返回B*,即B類的指針,執行步驟1,執行Printf()成員,輸出"  I am B";

2.  d.operator->()->Printf(); 等價於d->Printf();語句,

3.  d->operator->()->Printf();  按照結合性,劃分執行循序:((((d->)operator->())->)Printf());  (d->)中d是對象,執行d的“opterator->()" 成員函數,函數返回B*(pB)指針; 接着按照步驟1執行pB的operator->() 成員函數,返回A*(pA)指針,pA->Printf();pA是指針,按照步驟1執行pA的成員函數Printf(),輸出" I am A"

4. e->Printf();  e是對象,執行e的“opterator->()" 成員函數,函數返回B&(b),b是對象,再次執行b的“opterator->()" 成員函數,返回A*(pA)指針,按照步驟1,執行函數Printf(),輸出 “ I am A ”;

發佈了29 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章