指向資料成員的指標 收藏
指向資料成員的指標
指向資料成員的指標,是乙個有點神秘又頗有用處的語言特性,特別是如果你需要詳細調查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...
指向類資料成員 類成員函式的指標
成員指標是指可以指向類的非靜態成員的指標,一般情況下指標指向乙個物件,但是成員指標指示的是類的成員,而非類的物件,類的靜態成員不屬於任何物件,因此無須特殊的指向靜態成員的指標,指向靜態成員的指標與普通指標沒有什麼區別,成員指標的型別囊括了類的型別以及成員的型別,當初始化乙個這樣的指標時,我們令其指向...