More effective C++之基礎議題(chapter1)

大綱:
1、指針和引用
2、類型轉換
3、數組與多態的不可混用
4、默認構造函數
指針和引用
相同點:
間接地來使用對象
異同點:
指針可以指向空對象
引用必須指向非空對象,要求做初始化
可以改變指針指向,不可改變引用指向
抉擇:
重載運算符、必須指向非空對象、不想改變其指向,使用引用;實際上,大多數的場景,我們需要改變指向,相對而言,指針可能適用的場景更多。
此外,關於使用指針、引用的效率問題:
由於引用不可指向空對象,因此可以免去測試指針爲空步驟,所以使用引用的代碼效率更高。

2、類型轉換符
static_cast<Type>(expression)
const_cast<Type>(expression)
dynamic_cast<Type>(expression),沿着繼承關係向下進行類型轉換,對於指針轉換失敗,將返回空指針;對於引用轉換失敗,拋出異常。

3、數組與多態的不可混用
數組名稱類似於引用,不可更改其指向。
數組源自於C,多態是C++概念,兩者之間混用將帶來bug。
數組連續存儲,根據元素類型爲其分配好空間後,在做初始化(調用對象的默認構造函數),將一個派生類對象的數組賦值給基類對象數組,可能發生對象切割(對象不完整),調用虛函數將發生不可知行爲。

4、默認構造函數
功效:不利用任何外部數據就可以初始化類對象。對於一些類型來說,設置默認構造函數是合理的,另一些類型,提供默認構造函數是無意義的。按理來說,我們就按需來決定是否提供默認構造函數就好。
但是!如果類不提供默認構造函數,將會影響其使用範圍。具體來說,存在以下幾種限制場景:

  1. 無法生成該類型數組(由於要使用對象的默認構造函數)
    解決方案:
    用指針數組代替對象數組,此時數組存儲的指針,將不存在調用對象的默認構造函數問題,顯示調用元素構造函數生成對象,並將地址值賦值給數組的元素值。
    使用placement new ,在分配的內存上可顯示調用構造函數(避開默認構造函數限制),但是記得delete raw內存空間。
    在這裏插入圖片描述
    在這裏插入圖片描述
  2. 使用模板時,類作爲類型參數,特別是如果標準庫的模板可能調用類型參數的默認構造函數
  3. 虛基類

new和delete
new operator (new 操作符):
new operator 支持兩種調用形式:
其一,new Type()
其二,new (raw)Type()
根據有沒有指定raw地址,來決定調用何種operator new函數。調用operator new()獲取raw內存地址,在其上初始化對象;傳入指定地址,並調用placement new,在其地址上初始化對象。

程序員可直接調用operator new函數,此函數可重寫或重載(加入新的參數),返回未初始化的空間。類似於C的malloc。在這裏插入圖片描述
operator new聲明:返回一個指向未初始化的內存的指針
在這裏插入圖片描述
placement new(another new操作符)
在已將分配好的內存空間(raw)上調用對象構造函數
在這裏插入圖片描述
operator new(new操作)
在這裏插入圖片描述
delete 操作符:先調用對象析構函數,在釋放內存
delete 操作:僅釋放內存
operator delete(void *buffer)
在這裏插入圖片描述

使用placement new操作符生成的對象,不可以使用delete operator 釋放空間。不是配套的,new operator 生成的對象,可調用delete operator(void * buffer)釋放內存。

使用new操作符來動態分配內置類型(用戶定義類型)的數組,函數內調用operator new[]操作 分配合適大小的內存空間,調用指定個數的默認構造函數。
在這裏插入圖片描述
釋放內置類型(自定義類型)數組,調用析構函數釋放對象,在調用operator delete [] (buffer)釋放內存空間
delete [] ps;

關於new /delete operator 、operator new/delete 函數,new /delete operator不可直接重寫,功能不可變更,但可重寫(重載)內存分配函數(operator new/placement new)。

發佈了86 篇原創文章 · 獲贊 9 · 訪問量 9461
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章