一、指向類的普通成員的指標(非靜態)
1、指向類成員函式的指標
簡單的講,指向類成員函式的指標與普通函式指標的區別在於,前者不僅要匹配函式的引數型別和個數以及返回值型別,還要匹配該函式指標所屬的類型別。總結一下,比較以下幾點:
a)引數型別和個數
b)返回值型別
c)所屬的類型別(特別之處)
究其原因,是因為非靜態的成員函式必須被繫結到乙個類的物件或者指標上,才能得到被呼叫物件的this指標,然後才能呼叫指標所指的成員函式(我們知道,所有類的物件都有自己資料成員的拷貝,但是成員函式都是共用的,為了區分是誰呼叫了成員函式,就必須有this指標,this指標是隱式的新增到函式引數列表裡去的)。
明白了這點,接下來就簡單了。
宣告:與普通函式作為區分,指向類的成員函式的指標只需要在指標前加上類型別即可,格式為:
typedef 返回值 (類名::*指標型別名)(引數列表);
賦值指標型別名 指標名 = &類名::成員函式名;
注意:這裡的這個&符號是比較重要的:不加&,編譯器會認為是在這裡呼叫成員函式,所以需要給出引數列表,否則會報錯;加了&,才認為是要獲取函式指標。這是c++專門做了區別對待。
呼叫:呼叫方法也很簡單,針對呼叫的物件是物件還是指標,分別用.*和->*進行呼叫,格式為:
(類物件.*指標名)(引數列表);
(類指標->*指標名)(引數列表);
注意:這裡的前面一對括號是很重要的,因為()的優先順序高於成員操作符指標的優先順序。
下面舉個簡單的例子就一目了然了:
1 class a;
2 typedef void (a::*nonstaticfuncptr)(int); //typedef
3 4 class a
5
2、指向類資料成員的指標
成員函式搞懂了,資料成員也就easy了,只要判斷以下兩點是否一致即可:
a)資料成員型別
b)所屬的類型別
另外,宣告、賦值還有呼叫方法等這些是和前面類似的,再舉個例子吧:
1 class a;
2 typedef int (a::*nonstaticdataptr); //typedef
3 4 class a
5 8 int nonstaticmember;
9 };
10 11 int main()
12
執行結果,當然是各自輸出10和100啦。
二、指向類的靜態成員的指標
類的靜態成員和普通成員的區別在於,他們是不依賴於具體物件的,所有例項化的物件都共享同乙個靜態成員,所以靜態成員也沒有this指標的概念。
所以,指向類的靜態成員的指標就是普通的指標。
看下面的例子就明白了:
1 typedef const int *staticdataptr;
2 typedef int (*staticfuncptr)(); //跟普通函式指標是一樣的
3 4 class a
5 ;8 static const int staticmember = 10;
9 };
10 11 int main()
12
最後註明一下,顯然的,要使用(&類名::成員名)獲取指向成員的指標,首先這個成員必須是對外可見的哦,即public的,不然是沒有許可權獲取的^^。
寫到此,簡單總結一下就是:
1)靜態的和普通的函式指標沒啥區別;
2)非靜態的加乙個類侷限一下即可。
指向類成員的指標
前面曾寫過一篇惱人的函式指標 一 總結了普通函式指標的宣告 定義以及呼叫,還有函式指標陣列,函式指標用作返回值等。但是作為c 的研讀,我發現我漏掉了乙個最重要的內容,就是指向類成員的指標,這裡將做相應補充 相關 測試環境為vs 2010 指向類成員的指標總的來講可以分為兩大類四小類 指向資料成員還是...
指向類成員的指標
在c 語言中,可以定義乙個指標,使其指向類成員或成員函式,然後通過指標來訪問類的成員。這包括指向屬性成員的指標和指向成員函式的指標。指向非靜態資料成員的指標在定義時必須和類相關聯,在使用時必須和具體的物件關聯。由於類不是執行時存在的物件。因此,在使用這類指標時,需要首先指定類的乙個物件,然後,通過物...
指向類成員的指標
13.1.9 指向類成員的指標 在c 語言中,可以定義乙個指標,使其指向類成員或成員函式,然後通過指標來訪問類的成員。這包括指向屬性成員的指標和指向成員函式的指標。1 指向資料成員的指標 在c 語言中,可以定義乙個指標,使其指向類成員。當屬性成員為靜態和非靜態時,指標的使用也有不同。其中,指向非靜態...