C 之類成員指標

2021-07-30 10:27:51 字數 1752 閱讀 2171

需要用到  .* 和 ->* 兩個操作符了。其實這兩個操作符也沒啥新奇的。. 和 ->分別為物件和物件指標的成員訪問操作符, 而 * 則為解引用操作符。當寫下 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時出錯 靜態成員的特性 不管這個類建立了多少個物件,而其靜態成員只有乙個拷貝 副本 這個拷貝被所有屬於這個...