《深入探索C 物件模型》第三章奇怪語句解釋

2021-07-14 04:49:30 字數 865 閱讀 1748

在第三章的3.3節有下面這樣一段描述:

class point3d

;point3d origin;

origin.y = 0.0;

&origin + (&point3d::y - 1);

對於「-1」的操作解釋是這樣的:「指向data member的指標,其offset值總是被加上1,這樣可以使編譯系統區分出「乙個指向data member的指標,用以指出class的第乙個member」和「乙個指向data member的指標,沒有指出任何member」兩種情況」。

這句話簡直就不是人說的。什麼叫「乙個指向data member的指標,卻沒有指出任何member的兩種情況」!!!你都指向data member的指標了,還沒有指出任何member,這***的見鬼了!

當時心裡無數頭草泥馬狂飆而過啊。。。

幾經周折終於搞通了,這句話中指出的兩種情況,實際上應該是下面這樣子的。

class point3d

float point3d::*p1 =0;

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

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

if( p1 == p2 )

{ cout <<」 p1 & p2 contain the same value.」;

cout <<」they must address the same member!」<

至於「-1」的正解應該是這樣的:成員指標其實就是成員相對於當前物件的偏移量,按照這個說法p2指向的是point3d的第乙個成員,理論上應該是0的,但是由於0被null指標定義了,所以認為地規定p2=1,以此類推。

《深度探索C 物件模型》第三章讀書筆記

看之前的疑問 1.既然基類先於派生類初始化,基類的資料成員與派生類的資料成員是如何放置的?筆記 1.當初始化乙個類時,如果裡面沒有任何成員,那麼大小為1,編譯器這麼做的原因是為了讓每乙個物件都能保證獲得獨一無二的記憶體位址 2.在某些編譯器上,當類中沒有資料成員,但是卻存在虛函式時,那麼一些編譯器 ...

《深度探索C 物件模型》第三章 Data語意學

首先給出以下例子 y,z的記憶體大小受三個因素的影響 1.語言本身造成的額外負擔,指的是虛繼承中在類中會產生乙個指向虛表的指標,這個指標在32位的系統下是4個位元組。2.編譯器對特殊情況提供的優化處理。3.alignment限制。class a的大小由以下幾點決定 1.被共享的 class x,為1...

深度探索C 物件模型 第三章 Data 語意學

乙個有趣的問題 下列 類 sizeof大小 class x 1 class y public virtual x 4 or 8 class z public virtual x 4 or 8 class a public y,public z 8 or 12 主要原因 為了保持每乙個類生成物件在記憶...