C 成員在類中的偏移量 類成員指標

2021-08-22 04:29:47 字數 1154 閱讀 2732

首先來看一道程式設計題:寫出輸出的結果

#include 

class a

~a() {}

void fun()

private:

int m_a;

int m_b;

};class b

~b() {}

void fun()

private:

int m_c;

};void main()

程式的輸出結果為1

這裡主要涉及兩個方面:1)物件呼叫成員函式的時候會將物件與函式繫結;****2)物件訪問成員變數是根據成員變數距離物件的偏移量來訪問的,而不是根據成員名來訪問。(所謂偏移量就是告訴你乙個特定的成員位置距離物件起點有多少個位元組)

接著來分析為什麼輸出結果是1.

a.記憶體中例項化乙個a的物件a。

b.將a物件的位址強制轉化為b類的位址。

c.pb為b類的指標,理所當然呼叫的是b類的fun函式。

d.當呼叫fun函式的時候,呼叫物件與該函式進行繫結,即fun函式中隱含的形參this指標初始化為呼叫a類物件的位址。

e.按照道理,應該直接列印m_c的值。這裡要注意,物件在訪問類成員的時候,編譯器並沒有儲存物件各個成員的實際位址,而是儲存了其相對物件首位址的偏移量。

f.由於類b只有乙個成員m_c,在編譯階段,編譯器就記錄了m_c相對於b類的偏移量為0,故訪問m_c的時候,便是訪問當前物件this+偏移量

g.注意,這裡的this指標指向的是a類物件的首位址,在a類中偏移量 為0的是m_a。故列印m_a的值。

二.關於成員指標

1)成員指標只是記錄乙個成員的偏移量,而非位址,因為類中沒有位址。

2)選擇乙個類的成員只是意味著在類中偏移,只有把這個偏移和具體物件的首位址結合,才能得到實際位址。

3)成員指標並不指向乙個具體的記憶體位置,它指向的是乙個類的特定成員,而不是指向乙個特定物件的特定成員,最直接的理解是將其理解為乙個偏移量。這個偏移量適用於某一類a的任何物件,換言之,如果乙個a類物件的成員a距離起點的偏移量是4,那麼任何其他a類物件中,a的偏移都是4位元組。

C 中struct成員的偏移量的計算

c 中,計算struct成員的偏移量,有如下三種方法可用。假設有定義如下 struct st test 現想要求 b 相對於 st test 的偏移位址。1 常用的方法 size t st test 0 b 2 使用stl的定義,要包含 標頭檔案 offsetof st test b offseto...

C 類成員指標

類成員指標 1.成員指標式可以指向類的非靜態成員的指標。類的靜態成員不屬於任何物件,因此無需特殊的指向靜態成員的指標。指向靜態成員的指標的普通指標沒有任何區別。2.當初始化乙個類成員指標時,我們令其指向類的成員,但不指定代成員所屬的物件,直到使用到成員指標時,才提供所屬的物件。3.資料成員指標 例 ...

C 類成員指標

首先讓我們看一下,乙個簡單的成員變數指標 和 成員函式指標的使用例子。struct a int a pi a i void a pfoo a foo a a a.pi 1 等同於 a.i 1 a.pfoo 等價於 a.foo 在vc 下,輸出 a i 和 a foo 的值,你會發現他們的值都為1 在...