C primer 類成員指標

2022-09-01 16:18:19 字數 1611 閱讀 6815

1、宣告成員指標

有時我們希望直接獲取成員的指標,然後從乙個物件或別的物件獲得該成員,這時就需要用到成員指標。成員指標,包含類的型別以及成員的型別。

成員指標只針對類的非static成員。static類成員不是任何物件的組成部分,所以不需要特殊語法來指向static成員,static成員指標是普通指標。

注:它指向的是乙個類的特定成員,而不是指向乙個特定物件裡的特定成員。

成員指標的定義格式:成員型別 類名::*指標名=&類名::成員名;

成員函式指標的定義格式: 成員函式返回型別 類名::*指標名 = &類名::成員函式名(參數列);

成員函式的指標必須在三個方面與其指向的型別相匹配:

1)函式形參的型別和數目,包括成員是否為const;

2)返回型別;

3)所屬類的型別。

通過指定函式返回型別、形參表和類來定義成員函式的指標。

普通指標與成員指標的區別:

1)普通指標用確定物件的位址進行初始化,指向乙個確定的物件;

2)成員指標用類的成員(注意不是物件的成員)初始化(也就是只有偏移量的資訊,而沒有初始位址的資訊)。

2、指向成員指標的不可逆行

**:指向基類某個成員的指標可以轉換成指向派生類相應成員指標。然而,反過來卻不行。這條規則叫做「指向成員的指標的不可逆性」。下面我將解釋這個不可逆特性以及隱藏於其後的基本原理。

考慮以下兩個類:

struct base 

;struct derived : base

;

指向類 base 的乙個成員的指標不能引用類 derived 的相應成員:

typedef void (base::*pmf)(); 

pmf pmf1=&derived::func; //error

pmf pmf2=&base::func; //fine

base* ptr=new derived; //fine

然而,如果定義乙個指向類 derived 的乙個成員的指標,那麼可以隱式地將其轉成指向類 base 相應成員的指標:

typedef void (derived::*pmf)(); 

pmf pmf1=&derived::func; //fine

pmf pmf2=&base::func; //also fine

基本原理

這個不可逆性規則看上去有違直覺。在處理一般的指標和引用時,可以隱式地將乙個指向派生類的指標轉成乙個指向其基類的指標,但是相反卻不行:

base * p = new derived;    //ok 

derived *p = new base; //error, can't convert 'derived *' to 'base *'

然而,在指向成員的指標方面,情況恰恰相反。這是很有必要的,因為乙個派生類具有它所繼承的基類的所有成員;因此,任何指向基類乙個成員的指標都可以對映到派生類相應的成員上。相反行不通,因為派生類可能具有更多基類中不存在的成員。

引用文獻:

類成員指標

類成員指標一般很少用到,使用類成員的指標與普通指標的區別在於,需要在類成員指標前面的加上類限定符,以指明是哪個類的成員指標。同樣,在初始化指標時,也只能用相應類的相應型別的成員對指標進行初始化。成員指標的應用舉例 當乙個類有多個性質相同且型別相同的函式成員時,可以使用函式表來進行函式呼叫,產生用同一...

類成員指標

看到深度探索c 物件模型3.2節,其中給出了乙個判斷access section出現先後順序的模板函式如下 templatechar access order data type1 class type mem1,data type2 class type mem2 用以下程式測試 class po...

類成員指標

首先 函式指標是指向一組同型別的函式的指標 而類成員函式我們也可以相似的認為,它是指向同類中同一組型別的成員函式的指標,當然這裡的成員函式更準確的講應該是指非靜態的成員函式。前者是直接指向函式位址的,而後者我們從字面上也可以知道 它肯定是跟類和物件有著關係的。typedef int p int,in...