需要用到 .* 和 ->* 兩個操作符了。其實這兩個操作符也沒啥新奇的。. 和 ->分別為物件和物件指標的成員訪問操作符, 而 * 則為解引用操作符。當寫下 ac.*ipm 時,其實就是請求將 ac的位址加上ipm所表示的偏移量,然後訪問該 ac 所表示的物件中的特定資料成員。當寫下 pc->*ipm 時,其實就是pc所指向的位址加上ipm所表示的偏移量,然後訪問pc所指向的物件中的特定資料成員。
一、指向成員變數的指標並非指標
c++中指向成員變數的指標其實是乙個相對於類物件的偏移量。《c++必知必會》的條款15講述了這一說法:「與常規指標不同,乙個指向成員變數的指標並不指向乙個記憶體位置。它指向的是乙個類的特定成員,而不是指向乙個特定物件裡的特定成員。通常最清晰的做法是將指向資料成員的指標看作為乙個偏移量。......。這個偏移量告訴你,乙個特定成員的位置距離物件的起點有多少個位元組。」
看一段示例**:
[cpp]view plain
copy
class
democlass
// ....
public
: int
m_a;
};
intdemoclass::*ipm = 0;
// ipm是乙個指標,指向類democlass的乙個int成員,該處初始化為0
void
printaddress()
由其可見,給定乙個成員變數在類中的偏移量,為了訪問位於那個偏移量的資料成員,我們還需要該類的乙個物件的位址。這時候就需要用到 .* 和 ->* 兩個操作符了。其實這兩個操作符也沒啥新奇的。. 和 ->分別為物件和物件指標的成員訪問操作符, 而 * 則為解引用操作符。當寫下 ac.*ipm 時,其實就是請求將 ac的位址加上ipm所表示的偏移量,然後訪問該 ac 所表示的物件中的特定資料成員。當寫下 pc->*ipm 時,其實就是pc所指向的位址加上ipm所表示的偏移量,然後訪問pc所指向的物件中的特定資料成員。
二、指向成員函式的指標並非指標
獲取非靜態成員函式的位址時,得到的不是乙個位址,而是乙個指向成員函式的指標。為了對乙個指向成員函式的指標進行解引用,需要乙個物件或乙個指向物件的指標。因為通過指向成員函式的指標呼叫該函式時,需要將物件的位址用作this指標的值,以便進行函式呼叫(當然,也有其它的用途)。
下面是一段「指向成員函式指標」使用的示例**:
[cpp]view plain
copy
struct
point
; class
shape
bool
validate()
const
virtual
bool
draw()
const
= 0;
// ....
};
class
circle :
public
shape
// ....
};
void
(shape::*pmf)(point) = 0;
void
testmemberfunctionpointer()
儘管指向類成員(包括成員變數和成員函式)的指標使用很少,但是知道這些概念還是有好處的。
頂 2 踩
C 之類的靜態成員
類的靜態成員 用關鍵字static宣告 為該類的所有物件共享,靜態資料成員具有靜態生存期。必須在類外定義和初始化,用 來指明所屬的類。include using namespace std class point point point p point intgetx intgety void sh...
學習筆記之類的資料成員指標和函式指標
1.資料成員指標 成員指標訪問運算子 通過物件 或指標 獲取成員 獲取資料成員的兩種方式 auto p 類名 資料成員名 得到指向資料成員的指標,然後 auto data 類的物件.p 得到類的成員 此方法必須宣告為類的友元或者是類的成員 在類的成員函式裡邊返回類的資料成員的指標,通過呼叫成員函式得...
C 系列之類的靜態成員
靜態成員函式中不能呼叫非靜態成員,非靜態成員函式中可以呼叫靜態成員,因為靜態成員在編譯時已經存在,先於物件而存在,因而無法使用物件的成員函式 靜態成員變數使用前必須先初始化,否則會在linker時出錯 靜態成員的特性 不管這個類建立了多少個物件,而其靜態成員只有乙個拷貝 副本 這個拷貝被所有屬於這個...