源地址: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 ”;