1. 程式人生 > 其它 >C++ 類的記憶體佈局

C++ 類的記憶體佈局

程式記憶體佈局

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 

new/delete表示式 • 在C語言中,用來申請堆空間的方式,使用malloc/free庫函式 • 在C++中,用來做同樣操作的就是new/delete表示式

 

 new/delete與malloc/free的區別?

• 面試常考點: 1) malloc/free是標準庫函式,new/delete是表示式 2) malloc申請空間時需要自己指定位元組數;而new表示式不需要指 定 3) malloc不能進行初始化,但new可以進行初始化。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

class空類的時候是佔有1個位元組的,以此來區分不同的物件。

如:class S{}

S s1,s2;其中&s1與&s2的地址相差1。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

class存在資料段,所有宣告的物件其實共用的一個class。

物件可以在棧區也可以在堆區,this指標用於區分不同的物件,但是為什麼this指標不佔用物件的儲存空間呢?因為this指標存在暫存器中。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

類物件的大小隻有資料成員有關,而成員函式是存放在程式碼區的,屬於只讀區。成員函式可以在類外部實現,但是需要加上類作用域。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

拷貝建構函式引數不能去除const與&?

因為只有const引用能夠繫結到臨時物件,因此不能去掉 const關鍵字;去掉引用符號之後, 會導致拷貝建構函式 無窮遞迴呼叫自身, 沒有出口,直到棧溢位。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

主動呼叫解構函式並不能銷燬物件,解構函式的用法是在物件結束生命週期時被動呼叫來回收資料成員的堆空間的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

class中賦值運算子函式與拷貝建構函式的區別?

拷貝建構函式是建構函式,用於初始化類物件的時候;而賦值運算子函式用於賦值時,此時物件已被宣告。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

三合成原則

如果發現某一個類需要顯式定義以下函式中的某一個:

1. 解構函式 2. 拷貝(複製)建構函式 3. 賦值運算子函式

那麼,另外的兩個函式,也必須要顯式定義。因為涉及到了堆空間的建立與銷燬。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------