指向成員的指標運算子 .* 與 ->* 的區別
指向成員的指標運算子 .* 與 ->* 的區別
目錄
[1] 成員指標訪問運算子 .*
先來一個類STUDENT,注意其中將要表演的fun()函式要是共有的,不然後面不能夠進行訪問(私有成員函式的話!!!)。
class STUDENT { public: STUDENT(); ~STUDENT(); int fun(); private: char m_name[20]; int m_age; }; int STUDENT::fun() { cout << "這是STUDENT類的公有成員函式" << endl; return 0; } STUDENT::STUDENT() { } STUDENT::~STUDENT() { }
然後接下來我們該怎麼使用這個符號呢?(知道一說起來指標,就會有很多的人是柑橘到頭疼的,這裡可以參考我前一篇關於指標詳解的一篇二維陣列、指標詳解,如果這一篇理解,那麼對於這麼加深理解就會變得很容易。關鍵在於弄清楚指標和陣列對應的相應是幾級指標對應幾維陣列)
使用規則:(類的具體物件.*類的函式指標)( )
首先分別定義STUDENT的物件student和指向類的公有成員函式指標p;然後呼叫,得到結果
STUDENT student;
int (STUDENT::*p)() = &STUDENT::fun;
(student.*p)();
[2] 成員指標訪問運算子 ->*
我們還是沿用上面一個例子的類和物件,然後我們需要在使用的時候做一個改變,
使用規則:(類的具體物件的指標.*類的函式指標)( )
首先分別定義STUDENT的物件的student的指標pt和指向類的公有成員函式指標p;然後呼叫,得到結果
STUDENT student;
STUDENT *pt = &student;
int (STUDENT::*p)() = &STUDENT::fun;
(pt->*p)();
執行結果:
自己寫了呼叫的成員函式的三種方法,其中顯而易見的區分了 .* 與 ->* 的區別,心急的可以直接逃過看最後的結論部分,不過還是建議自己是動手寫一下。
其中補充說明一點:
使用類的成員函式指標進行賦值時候,一定要叫上&,否則報錯誤,這裡並不是說它錯了,而是說它這樣子可能不規範。有的編譯器不會通過,比如VS2015
。
所以說書上的也需要自己動手確定實踐,另外就是書寫規範,會幫助我們避免很多錯誤。另外突然發現這兩個符號在msdn上面居然有說明,啊啊啊啊啊啊。傳送門https://msdn.microsoft.com/zh-cn/library/k8336763.aspx。這兩個符號大二初學習時候一直不明白,但是現在大四回過頭來看,竟然是如此的簡單,可能一次不理解的,多看幾次就會理解。
總結:
指向成員的指標運算子(.* 和 –>*)返回表示式左側上指定的物件的特定類成員的值。右側必須指定該類的成員。
二元運算子 .* 將其第一運算元(必須是類型別的物件)與其第二運算元(必須是指向成員的指標型別)組合在一起。
二元運算子 –>* 將其第一運算元(必須是指向類型別的物件的指標)與其第二運算元(必須是指向成員的指標型別)組合在一起。
在包含 .* 運算子的表示式中,第一運算元必須是類型別且可訪問,而指向第二運算元中指定的成員的指標或可訪問型別的成員的指標明確從該類派生並且可供該類訪問。
在包含 –>* 運算子的表達方式中,第一運算元必須是第二運算元中指定的型別的“指向類型別的指標”或明確地從該類派生的型別。