讀書筆記-----類和動態內存分配

在使用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刪除對象時,析構函數纔會被調用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章