讀書筆記 類和動態記憶體分配

2021-06-16 08:15:21 字數 1293 閱讀 9165

在使用c++過程中要合理的分配和使用記憶體,在之前幾章中,我們通常都是事先分配好記憶體,比如,建立乙個類,其中某乙個成員表示某人的姓,最簡單的方法就是建立乙個字元陣列來儲存成員的姓,但是這也有乙個問題,我們不知道成員的姓到底有多長,如果陣列長度短了成員的姓在儲存過程中就會丟失,陣列長度過長,成員姓儲存下來了,但是會造成記憶體浪費,特別是是在成員眾多時。如果是在程式執行階段按需分配記憶體,那麼就不會造成記憶體浪費了。在類物件中,我們通常在類建構函式中採用new操作符來分配記憶體,但是在類中使用new也會帶來其他一些新的問題,還要一些額外的擴充套件函式來保證new能安全正確的按需分配記憶體。c++分配記憶體的策略就是使用時再分配記憶體。

在c++中當使用乙個物件來初始化另乙個物件時,編譯器將自動生成建構函式,有時這些編譯器自定生成的建構函式也會帶來一些問題。

c++自動提供了五種成員函式:預設建構函式(如果沒有定義建構函式),複製建構函式(如果沒有定義),賦值操作符(如果沒有定義),預設析構函式(如果沒有定義),位址操作符(如果沒有定義)。

預設建構函式:如果程式沒有提供任何建構函式,那麼編譯器將提供乙個不帶任何操作、不接收任何引數的建構函式,因為建立物件時總會用到建構函式。如果定義了建構函式,c++將不會用到定義預設建構函式。

複製建構函式:複製建構函式用於將乙個物件複製到新建立的物件中,也就是用於初始化而不是常規賦值過程中,它的原型通常如下:class_name(const class_name &)。那麼什麼時候呼叫複製建構函式呢?新建乙個物件並將其初始化為同類現有物件時,都會呼叫複製建構函式。將函式按值傳遞或者函式返回物件時,也會呼叫複製建構函式。預設的複製建構函式會逐個複製非靜態成員變數,複製的是成員的值

如果類中包含了使用new初始化的指標成員,應當定義乙個複製建構函式,以複製指向的資料,而不是指標,這被稱為深度複製。複製的另外一種形式是只複製指標值。

賦值操作符:c++允許通過自動類過載賦值操作符實現物件賦值,這種操作符的原型如下:class_name & class_name::operator = (const class_name &),它接受並返回乙個指向類物件的引用。

在建構函式中使用new來初始化指標成員,則應在析構函式中使用delete,如果有多個建構函式,則必須以相同的方式使用new,要麼都帶中括號,要麼都不帶,有乙個例外,就是在建構函式中使用new初始化指標函式,而在另外乙個建構函式中將指標初始化為空,delete可以用於空指標。

下面幾種情況下析構函式將被呼叫

當物件是動態變數時,執行完定義該物件的程式塊時,將呼叫該物件的析構函式。

當物件是靜態變數時,程式結束時將呼叫物件的析構函式。

當物件是用new建立的時,僅當顯示使用delete刪除物件時,析構函式才會被呼叫。

類和動態記憶體分配

part 1 靜態類成員特點 無論建立了多少物件,程式都只建立乙個靜態類變數副本。也就是說,類的所有物件共享乙個靜態成員。靜態資料成員在類宣告中宣告,在包含類方法的檔案中初始化。初始化時使用作用域運算子來指出靜態成員所屬的類。但如果靜態成員是const整數型別或列舉型,則可以在類宣告中初始化。par...

類和動態記憶體分配

整理自 c primer plus vector force1 50,60 vector force2 10,70 vector max max max force1,force2 version1 vector max const vector v1,const vector v2 version...

C 類和動態記憶體分配

預設析構函式 複製建構函式 賦值運算子 位址運算子 ifndef zhumeng h define zhumeng h include class zhumeng endif include zhumeng.h int zhumeng numm 0 zhumeng zhumeng zhumeng z...