最近由於工作,學習了下箭頭操作符,好複雜的說,過了沒幾天就忘了,又學了一遍。
同時決定,這裏記錄下,備忘!
(這裏的內容,參考了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。