前面曾寫過一篇惱人的函式指標(一),總結了普通函式指標的宣告、定義以及呼叫,還有函式指標陣列,函式指標用作返回值等。但是作為c++的研讀,我發現我漏掉了乙個最重要的內容,就是指向類成員的指標,這裡將做相應補充(相關**測試環境為vs 2010)。
指向類成員的指標總的來講可以分為兩大類四小類(指向資料成員還是成員函式,指向普通成員還是靜態成員),下面一一做介紹:
一、指向類的普通成員的指標(非靜態)
1、指向類成員函式的指標
簡單的講,指向類成員函式的指標與普通函式指標的區別在於,前者不僅要匹配函式的引數型別和個數以及返回值型別,還要匹配該函式指標所屬的類型別。總結一下,比較以下幾點:
a)引數型別和個數
b)返回值型別
c)所屬的類型別
(特別之處)
究其原因,是因為非靜態的成員函式必須被繫結到乙個類的物件或者指標上,才能得到被呼叫物件的this指標,然後才能呼叫指標所指的成員函式(我們知道,所有類的物件都有自己資料成員的拷貝,但是成員函式都是共用的,為了區分是誰呼叫了成員函式,就必須有this指標,this指標是隱式的新增到函式引數列表裡去的)。
明白了這點,接下來就簡單了。
宣告:與普通函式作為區分,指向類的成員函式的指標只需要在指標前加上類型別即可,格式為:
typedef 返回值 (類名::
*指標型別名)(引數列表); 賦值
指標型別名 指標名 = &類名::成員函式名;
注意:這裡的這個&符號是比較重要的:不加&,編譯器會認為是在這裡呼叫成員函式,所以需要給出引數列表,否則會報錯;加了&,才認為是要獲取函式指標。這是c++專門做了區別對待。 呼叫
:呼叫方法也很簡單,針對呼叫的物件是物件還是指標,分別用.*和->*進行呼叫,格式為:
(類物件.*指標名)(引數列表);
(類指標->*指標名)(引數列表);
注意:這裡的前面一對括號是很重要的,因為()的優先順序高於成員操作符指標的優先順序。
下面舉個簡單的例子就一目了然了:
12、指向類資料成員的指標class a;
2 typedef void (a::*nonstaticfuncptr)(int); //
typedef34
class a
5 12
private:
13int nonstaticmember;
14 };
1516
int main()
17
成員函式搞懂了,資料成員也就easy了,只要判斷以下兩點是否一致即可:
a)資料成員型別
b)所屬的類型別
另外,宣告、賦值還有呼叫方法等這些是和前面類似的,再舉個例子吧:
1執行結果,當然是各自輸出10和100啦。class a;
2 typedef int (a::*nonstaticdataptr); //
typedef34
class a5 8
int nonstaticmember;
9 };
1011
int main()
12
二、指向類的靜態成員的指標
類的靜態成員和普通成員的區別在於,他們是不依賴於具體物件的,所有例項化的物件都共享同乙個靜態成員,所以靜態成員也沒有this指標的概念。
所以,指向類的靜態成員的指標就是普通的指標。
看下面的例子就明白了:
1 typedef const最後註明一下,顯然的,要使用(&類名::成員名)獲取指向成員的指標,首先這個成員必須是對外可見的哦,即public的,不然是沒有許可權獲取的^^。int *staticdataptr;
2 typedef int (*staticfuncptr)(); //
跟普通函式指標是一樣的34
class a
5 ;8
static
const
int staticmember = 10;
9 };
1011
int main()
12
寫到此,簡單總結一下就是:
1)靜態的和普通的函式指標沒啥區別;
2)非靜態的加乙個類侷限一下即可。
不知道以後還會不會有函式指標相關的內容,先到此完結吧。
有錯誤歡迎指正,我會及時修改^^。
(完)**:
13 6指向類成員的指標
1.普通函式指標不能付給類的成員函式 要用類指標呼叫類成員函式 不能滿足三個條件1引數2返回值3他的類 2類成員指標 定義 指向值的型別 類名 指標名 short screen ps screen screen height 3類成員函式的指標 定義 返回值型別 類名 指標名 引數列表 int sc...
重學C (2) 指向類成員的指標
指向類成員的指標,印象中似乎很少用到,重新學習c 的過程中,才發現自己是忽視了乙個很重要的東東,以前我一直認為類的成員函式不能作為 函式,所以很多c程式都始終無法移植到c 上來,現在才知道,這是對指向類成員的指標不了解的緣故。1 指向非靜態成員的指標 其實指向非靜態的類成員的指標很容易,它們與普通指...
類和物件程式設計(八) 指向類的指標
乙個指向 c 類的指標與指向結構的指標類似,訪問指向類的指標的成員,需要使用成員訪問運算子 就像訪問指向結構的指標一樣。與所有的指標一樣,您必須在使用指標之前,對指標進行初始化。下面的例項有助於更好地理解指向類的指標的概念 include using namespace std class box ...