C++學習筆記42——過載操作符之箭頭操作符
函式語句為:
a->b;(其中,b可以是函式或者成員;)
步驟1. 如果a是指標,指向一個具有成員b的類物件,那麼a->b返回a型別的成員b,至此,語句結束;
步驟2. 如果a是一個物件(物件必須重定義了“operator->”,否則報錯),那麼就呼叫a的operator->()函式,返回值:如果是指標則繼續執行步驟1,如果是物件則繼續執行步驟2,直到最終走到指標結束。
與此相對應,過載的箭頭操作符的返回型別,只能是以下兩種:
(1)返回指向類型別的指標;
(2)返回定義了自己的箭頭操作符的類型別的物件;
示例:
/*******************************************************************/ // 過載箭頭操作符 /*******************************************************************/ //類的定義,只有成員函式,沒有資料成員 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 D " << 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; B b; d->Printf(); // I am B d.operator->()->Printf(); // I am B d->operator->()->Printf(); // I am A E e; e->Printf(); // I am A b = e.operator->(); //OK //b = e->();//error! //b = e->;//error! b.Printf(); // I am B 呼叫B自身的成員函式 b->Printf();// I am A 先返回A,再指向A的成員函式 }
解析:
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 ”;