c 中指向類資料成員的指標

2021-07-13 23:48:11 字數 1305 閱讀 4969

首先提出幾個問題:
1、怎麼獲得資料成員的偏移量?

2、如果類中有虛函式,類的布局是怎麼樣?vptr是放在物件記憶體的開始處還是結尾處,還是什麼地方?(當然具體的編譯器實現不同)

在這裡在vs2010上進行幾個簡單的測試

測試例子1

point3d.h檔案
#pragma once

class point3d

;

test.cpp檔案
#include #include #include "point3d.h"

using namespace std;

int main(void)

輸出結果:

0, 4, 8
1
1

1

上例中main函式中的&point3d::x、&point3d::y、&point3d::z所求分別為x、y、z在類物件中的偏移量(offset)。偏移量的實現大多數編譯器是通過整數來實現。這也表明指向類的資料成員的指標就是乙個偏移量,並不是指向記憶體的具體位址。《深入理解c++物件模型》中講到,對於偏移量,有些編譯器會將資料成員的偏移量加上1。這樣做的目的是為了區分乙個「沒有指向任何資料成員的」指標和乙個指向「第乙個資料成員的指標」(上面說了指向資料成員的指標也是偏移量,有些編譯器實現為整數)。

但是可以看到vs2010中,並沒有將偏移量增加1。所以說,使用printf的輸出結果為0,4,8。而使用,cout的輸出卻都為1,這是因為iostream並沒有過載成員指標型別。所以編譯器在這裡進行了轉化,輸出結果全為1。

如果類中有虛函式是,在vs2010中vptr的布局是怎麼樣的呢?

注意我只將point3d類稍作修改,將它的析構函式宣告為虛函式

#pragma once

class point3d

;

輸出結果:
4, 8, 12
1
1

1

從這個例子可以看出,vs2010中vptr放在類物件的記憶體的開始處。所以三個資料成員的偏移量分別是4 、8 、12。

指向類資料成員 類成員函式的指標

成員指標是指可以指向類的非靜態成員的指標,一般情況下指標指向乙個物件,但是成員指標指示的是類的成員,而非類的物件,類的靜態成員不屬於任何物件,因此無須特殊的指向靜態成員的指標,指向靜態成員的指標與普通指標沒有什麼區別,成員指標的型別囊括了類的型別以及成員的型別,當初始化乙個這樣的指標時,我們令其指向...

C 指向類的成員的指標

想必接觸過c的朋友們對c語言中指標的概念已經有了深入的了解 如果初步進行了解的朋友可以看一下 c語言基礎學習筆記 指標展開來講的基本知識點包括 指標的概念 指標的定義和初始化及簡單使用 指標函式和函式指標 有關指標函式和函式指標的內容上面的鏈結中也有介紹 不得不說,c 作為c語言的擴充套件,在物件導...

指向類成員的指標

一 指向類的普通成員的指標 非靜態 1 指向類成員函式的指標 簡單的講,指向類成員函式的指標與普通函式指標的區別在於,前者不僅要匹配函式的引數型別和個數以及返回值型別,還要匹配該函式指標所屬的類型別。總結一下,比較以下幾點 a 引數型別和個數 b 返回值型別 c 所屬的類型別 特別之處 究其原因,是...