C++ primer 第十三章

1. 複製構造函數是一種特殊的構造函數,具有單個形參,該形參是對該類類型的引用。當定義一個新對象並用一個同類型的對象對它初始化時,將顯式使用複式構造函數。當將該類型的對象傳遞給函數或從函數範圍該類型的對象時,將隱式使用複製構造函數。

 

2. 【複製初始化】總是調用複製構造函數。複製初始化首先使用指定構造函數創建一個臨時對象,然後用複製構造函數將那個臨時對象複製到正在創建的對象。

當函數形參或者返回值爲類類型時,由複製構造函數進行復制。

 

3. 對於容器,如果元素是類類型,在使用只提供容量的容器初始化函數時,如 vector<string> vec(5);編譯器先用類默認構造函數創建臨時對象,然後用複製初始化函數將臨時值複製到各個元素。

 

對於數組,如果沒有爲類類型的數組提供元素初始化式,嘖將用默認初始化函數初始化各個元素。

 

4. 如果沒有定義複製構造函數,編譯器會自動合成一個。合成複製構造函數將對除了static成員外的每個成員進行復制。對內置類型成員,直接複製值;對類類型成員,調用該類複製構造函數複製;對於數組成員,將複製數組的每一個元素。

 

5. 如果想要防止複製,需要顯式聲明其複製構造函數爲private。通過聲明但不定義複製構造函數,可以禁止任何複製類類型對象的嘗試。

不允許複製的類對象只能作爲引用傳遞給函數或者從函數返回,也不能用作容器的元素。

 

6. 如果定義了複製構造函數,則必須定義默認構造函數。

 

7. 動態分配的對象只有在指向該對象的指針被刪除時才撤銷。如果沒有刪除該指針,嘖不會運行該對象的析構函數,對象會一直存在,造成內存泄露。而且對象內部使用的任何資源也不會釋放。

 

8. 撤銷一個容器(包括數組)時,會運行容器中的類類型的析構函數,容器中的元素是按逆序撤銷的。

 

9. 三法則: 如果類需要析構函數,則它也需要賦值操作符和複製構造函數,這三個複製控制成員同時被需要。

 

10. 不管是否自己定義析構函數,編譯器總會爲我們合成一個析構函數。和程析構函數並不刪除指針成員所指向的對象。所以如果有這類對象,我們需要自己析構。

 

11. 智能指針:就是把指針包裝成一個類,包含一個整數值計數器,來表示有多少對象共享同一指針。當計數器爲0時,纔可以刪除指向的對象。這是一種避免類中的指針成員成爲懸垂指針的方法。

 

12. 另一種防止懸垂指針的方法是,在進行賦值或者複製操作時,對於指針類型,不改變指針所指的對象,而是改變指針所指向對象的值。這樣就能保證每個指針都是指向唯一一個對象,析構時可直接刪除。

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