指向類成員的指標

2021-06-04 11:30:49 字數 2007 閱讀 1282

一、指向類的普通成員的指標(非靜態)

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 語言中,可以定義乙個指標,使其指向類成員。當屬性成員為靜態和非靜態時,指標的使用也有不同。其中,指向非靜態...