Date語意學 Data Member的訪問

2021-07-06 06:03:33 字數 1432 閱讀 5577

已知下面這段**

point3d origin,*pt =&origin;
訪問data member有什麼區別

origin.x =0.0;

pt->x = 0.0;

static data members被編譯器提出於class之外,被視為乙個global變數。

若x是乙個static data members,則

origin.x =

0.0;

pt->x =

0.0;

//被轉化為

point3d::x

=0.0

//兩個一樣

&point3d::chunksize;

//會得到型別如下的位址

const

int*;

如果兩個class宣告了名字相同是static data members,會導致data segment名字衝突。編譯器的解決方法是暗中對static data members進行編碼,以獲得乙個獨一無二的名字,並可以輕易的推倒回原來的名字。

nostatic data members存放在每乙個class object 中。經由顯示或隱式(implicit)的class object來訪問他們。只要在member function中直接處理nostatic data members,所謂的implicit class object就好發生。

point

3d point3d::translate(const point3d &pt)

經由implicit class object轉化為

point 3d point3d::translate(point3d *const

this,const point3d &pt)

origin.y =

0.0;

&origin + (&point3d::y

-1);//注意其中的-1操作

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

每乙個nostatic data members的offset在編譯時期即可獲知,訪問效率和訪問c struct member一樣。

當point3d是乙個derived class ,其繼承結構中有乙個virtual base class,並且被訪問的member(如x)是從該virtual base class繼承而來的時候,我們不能確定pt指向哪一種class type,所以需要乙個間接引導,如果使用origin就不會有問題。

執行期語意學

物件的構造和析構 講解在以下幾種情況下 編譯器是如何安插構造和析構函式?1.全域性物件 2.區域性靜態物件 3.陣列物件 1 全域性物件 matrix g identity main c 保證了在main函式中第一次用到g str之前,將g str構造出來,在main 函式結束之前將g str毀掉。...

建構函式語意學

default建構函式操作 首先需要說明 帶來的第乙個問題,編譯器什麼時候合成預設建構函式 nontrivial 答案是編譯器需要的時候,而不是程式需要的時候。1 class foo class bar void foo bar 此時編譯器就會合成default 建構函式 類似 inline bar...

建構函式之語意學

1 乙個類是不是一定有建構函式?c annotated referencemanual arm 建構函式只在需要的時候才會被編譯器產生出來。關鍵字 在需要的時候 被誰需要?一種是程式需要的時候,一種是變編譯器需要的時候。如果程式有需要 如,完成某些非靜態資料成員的初始化 那是程式設計師的責任,程式設...