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; //okderived *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...