C 基礎之指向成員的指標

2021-09-01 07:31:12 字數 1562 閱讀 6079

c++中指向成員的指標

乙個類有兩種基本的成員:函式成員和資料成員。同樣的,指向成員的指標也有兩種:指向函式成員的指標和指向資料成員的指標。後則其實並不常用,因為類一般是不含有公共資料成員的,僅當用在繼承用c寫的**時協調結構(struct)和類(class)時才會用到。

指向成員的指標是c++語法中最難以理解的構造之一,但是這也是乙個c++最強大的特性。它可以讓你呼叫乙個類的函式成員而不必知道這個函式的名字。這乙個非常敏捷的呼叫工具。同樣的,你也可以通過使用指向資料成員的指標來檢查並改變這個資料而不必知道它的成員名字。

指向資料成員的指標

儘管剛開始時,指向成員的指標的語法會使你有一點點的迷惑,但你不久會發現它其實同普通的指標差不多,只不過是*號的前面多了::符號和類的名字,例:定義乙個指向int型的指標:

int * pi; 

定義乙個指向為int型的類的資料成員:

int a::*pmi; //pmi是指向類a的乙個int型的成員

你可以這樣初始化它:

class a;/*

指向類資料成員的指標與普通指標的初始化及賦值方式不太一樣,因為普通指標在給其初始化或賦值時,賦予的是乙個實際的物件,如  int j; int *i=&j;

而指向資料成員的指標賦予的是乙個目前還不存在的乙個類成員的位址,而這個位址只有在使用實際類物件進行呼叫時才會真正的確定下來,如下:

*/int a::*pmi = & a::num; 

上面的**是宣告乙個指向類a的乙個int型的num成員並將它初始化為這個num成員的位址.通過在pmi前面加上*你就可以使用和更改類a的num成員的值:

a a1, a2;

int n=a1.*pmi; //把a1.num賦值給n

a1.*pmi=5; // 把5賦值給a1.num

a2.*pmi=6; // 把6賦值給6a2.num

如果你定義了乙個指向類a的指標,那麼上面的操作你必須用 ->*操作符代替:

a * pa=new a;

int n=pa->*pmi;

pa->*pmi=5; 

指向函式成員的指標

它由函式成員所返回的資料型別構成,類名後跟上::符號、指標名和函式的引數列表。舉個例子:乙個指向類a的函式成員(該函式返回int型別)的指標:

class a

; int (a::*pmf) ();

上面的定義也就是說pmf是乙個指向類a的函式成員func()的指標.實際上,這個指標和乙個普通的指向函式的指標沒什麼不同,只是它包含了類的名字和::符號。你可以在在任何使用*pmf的地方呼叫這個函式

func():

pmf=&a::func;

a a;

(a.*pmf)(); //呼叫a.func()

如果你先定義了乙個指向物件的指標,那麼上面的操作要用->*代替:

a *pa=&a;

(pa->*pmf)(); //呼叫pa->func()

指向函式成員的指標要考慮多型性。所以,當你通過指標呼叫乙個虛函式成員時,這個呼叫將會被動態**。另乙個需要注意的地方,你不能取乙個類的建構函式和析構函式的位址。

C 之指向成員的指標

指標是指指向一些記憶體位址的變數,可以是資料的位址,也可以是函式的位址。同樣,c 的成員指標也遵從同樣的概念。但是,c 的成員指標只能指向類內部的成員,並且在類內部是沒有位址的 因此,成員指標要求選擇乙個物件的同時間接引用成員指標。以下的例子可以說明如何建立和使用指向資料成員的指標 include ...

c 指向物件成員的指標

在c 中類是抽象的,沒有實際記憶體,而物件是具體,是占有記憶體的,因此物件有位址,存放物件的起始位址的指標變數就是指向物件的指標變數。物件中的成員也是占有記憶體的,所以,存放物件成員的起始位址的指標變數就是指向物件成員的指標變數。1.指向物件資料成員的指標 int p1 定義指向整形資料的變數 p1...

指向成員的指標

1 從封裝的角度看,類可認為是乙個命名空間,名稱就是類名。類中有兩個成員 欄位和方法。2 指標可以指向任何物件,當然也可以指向類中的字段和方法。那麼該如何指向類中的字段和方法呢?3 分別是 int animal pdata animal age int animal pfun animal geta...