《More Effective C 》讀書筆記

2021-09-05 01:31:59 字數 1362 閱讀 5605

1、指標和引用的使用場景

確定變數永遠不會為空且不會作為其他變數的代表時用引用;變數有可能會為空或者在不同的時間會指向不同的物件時用指標。

2、型別裝換最好使用c++轉型操作符

static_cast  基本型別之間的轉換

const_cast  常量轉非常量(去除常量屬性)

dynamic_cast  繼承體系中父類與子類之間的安全轉型,失敗返回null

reinterpret_cast  任意型別之間的轉換 常用於轉換函式指標型別。

3、不以多型方式處理陣列。

4、非必要不提供預設建構函式

會導致class物件內的成員變數沒有初始化值。

5、最好不用 定製的型別轉換函式 (operator type()),如有需要,直接寫乙個專門轉型的函式。

6、區別前置後置的++,--,過載時後置++最好返回const,帶乙個不被使用的引數和前置++區別。

7、不過載&& || , 3個操作符。

8、operator new和new operator是不一樣的 

operator new分配記憶體並呼叫構造,new operator 只分配記憶體。

9、函式引數和異常引數的區別:

a>catch子句一定會發生複製行為且比較慢

b>呼叫函式正常情況下控制權在呼叫端,丟擲異常後控制權不再屬於丟擲端。

c>throw;  throw e;  盡量使用throw;  後者丟擲的是引數的副本,如果引數有繼承體系,可能會改變丟擲的型別。

d>函式呼叫時不允許傳遞臨時物件的引用,但是丟擲異常可以。

e>隱式型別轉換只發生於函式中,異常並不會有隱式的型別轉換,如double型別的catch子句不會捕捉int型別的異常,異常有兩種轉換:繼承架構中的類轉換和有型指標到無型指標的轉換。

異常會使得程式**量增加並且效率下降,故異常一定要在必要的地方使用,不濫用,丟擲真正的異常。

mutable 關鍵字 修飾的變數可以在任何成員函式內被修改,即使是常成員函式

10、緩式評估 類似於string的寫時拷貝 

11、超急評估 使用區域性快取將昂貴的動作 如「資料庫查詢」轉換成「記憶體資料結構查詢」。

18、分期攤還所需要的計算成本,類似於計算機在讀取vector時的快取,提前載入先前讀取過位置附近的資料。

19、臨時物件的**

a>函式形參實參型別不吻合,如傳入char陣列,形參為string,在傳參過程中會產生臨時物件,非常引用引數不允許產生臨時引數

b>函式返回物件,很多時候不能避免

21、適當利用函式過載避免隱式型別轉換

22、復合型別操作符比獨身操作符效率高,因為不產生臨時物件的構造和析構 如+=好於+

23、含有虛函式的類的每個物件都有乙個虛函式指標,虛函式不能是內聯函式

More Effective C 《基礎議題》

1 指標 指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元 而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如 int a 1 int p a int a 1 int b a 上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a...

More Effective C 擴充套件方法

c 3.0中增加了許多新特性.其中.擴充套件方法允許我們在不修改原有 的基礎上擴充套件類 介面的功能.有技巧的運用該特性.能寫出有效率 易維護 美觀的 c 2.0提供了許多泛型與容器的介面和類.最常見的如icomparable常常需要新建乙個comparable來進行排序比較等等.但其預設只有乙個c...

more effective C 條款四解讀

深刻考慮是否需要給類提供乙個預設建構函式 有一些類擁有乙個預設建構函式是合理的需求,比如string比如容器 linked list vector 預設建構函式可以把他們初始化為空容器。但是有一些類我們最好還是不要提供預設建構函式。比如乙個equipment類 class equipment 對於這...