指向資料成員的指標

2021-05-24 14:16:56 字數 1558 閱讀 6462

指向資料成員的指標 收藏

指向資料成員的指標

指向資料成員的指標,是乙個有點神秘又頗有用處的語言特性,特別是如果你需要詳細調查class members的底層布局的話。這樣的調查可以用於決定vptr是放在class的起始處或者尾端。另外乙個用途是可以用來決定class中的access sections的次序。

考慮下面的point3d宣告。其中有乙個virtual function,乙個static data member,以及三個座標:

class point3d;

public://如果換成private或者protected,則報錯

static point3d origin;

float x;

float y;

float z;

int main()

printf("&point3d::x = %p/n", &point3d::x);

printf("&point3d::y = %p/n", &point3d::y);

printf("&point3d::z = %p/n", &point3d::z);

std::cout<<"&point3d::x = "<<&point3d::x輸出結果為:

&point3d::x = 00000004

&point3d::y = 00000008

&point3d::z = 0000000c

&point3d::x = 1

&point3d::y = 1

&point3d::z = 1

press any key to continue

在vc6.0下,並沒有增加1,原因可能是visual c++做了特殊的處理。

在vc6.0下,通過printf或者cout的形式,都可以正常執行,只不過,得到的結果不一致。使用std::cout時,都輸出的是1,應該作何解釋呢?

以上程式,如果資料成員為private或者protected的,則無法編譯通過,而書上的例子,卻是protected,作者的測試程式可能是怎樣的呢?

(以上程式在vc6.0,virsual studio2008,dev-c++下測試過,與《深入探索c++物件模型》p131對應的說明有些出入)

為啥傳回的值會多1個位元組呢?這乙個位元組,主要用來區分「沒有指向任何資料成員的指標」和「指向第乙個資料成員的指標」這兩種情況

。考慮下面這樣的例子:

float point3d::*p1 =0;

float point3d::*p2 = &point3d::x;

//point3d::* 的意思是「指向point3d data member」的指標型別

if( p1 == p2 );

public:

float x;

float y;

float z;

int main()

point3d origin;

printf("&origin.z = %p/n", &origin.z);

return 0;

輸出結果為:

&origin.z = 0013ff7c

指向資料成員的指標

指向資料成員的指標 飄飄白雲 資料成員的指標有兩種含義,一種是沒有繫結具體物件的資料成員指標,其位址實際是該資料成員在類布局結構中的位移 另一種是繫結了具體物件的的資料成員指標,其位址是該物件的該資料成員在記憶體中的位址。下面參照書中的例子用vs2005中在32位的機器上寫了個測試程式。輸出結果 第...

指向成員的指標

1 從封裝的角度看,類可認為是乙個命名空間,名稱就是類名。類中有兩個成員 欄位和方法。2 指標可以指向任何物件,當然也可以指向類中的字段和方法。那麼該如何指向類中的字段和方法呢?3 分別是 int animal pdata animal age int animal pfun animal geta...

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

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