1.為了防止資源洩漏,請使用raii物件,在建構函式裡面獲得資源,並在析構函式裡面釋放資源.
2. 引用計數型智慧型指標(rcsp):持續追蹤多少個指標指向該資源,無人指向他時自動刪除該資源,如unique_ptr、shared_ptr和auto_ptr(現在已經沒有了,可能改成weak_ptr)。
一般資源管理類複製時可以選擇以下做法:
禁止複製(複製不合理)。
「引用計數法」(使用tr1::shared_ptr指定「刪除器」阻止引用次數為0時的刪除行為)。
複製底層資源(「深度拷貝」)。
轉移底部資源的擁有權(auto_ptr)。
apis
往往要求訪問原始資源,所以每乙個
raii class
應該提供乙個「取得其所管理之資源」的辦法。
對原始資源的訪問可能經由顯示轉換或隱式轉換。一般而言顯示轉換比較安全,但隱式轉換對客戶比較方便。
shared_ptr
等智慧型指標的
get成員函式可以實現顯式轉換(安全,受歡迎)返回原始資源指標。
new和delete對應,new[ ]和delete[ ]對應
如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩露。
1.好的介面很容易被正確使用,不容易被誤用;努力達成這些性質
2.「促進正確使用」的辦法包括介面的一致性,以及與內建型別的行為相容;「防治誤用」的辦法包括建立新型別,限制型別上的操作,束縛物件值,以及消除使用者的資源管理責任
3.tr1::shared_ptr支援定製型刪除器,可預防dll問題,可被用來自動解除互斥鎖等等
class的設計就是type的設計,在定義乙個新type之前,回顧本條款的問題。
1. 盡量以pass-by-reference-to-const替換pass-by-value,比較高效,並可避免切割問題
2. 對於內建型別,以及stl的迭代器和函式物件pass-by-value往往更高效
原因:預設情況下
c++以
by value
方式傳遞物件至函式。除非你另外指定,否則函式都是以實際實參的副本為初值,而呼叫端所獲得的亦是函式返回值的副本,而這些副本是由物件的拷貝建構函式產出,會帶來費時操作。
1. 絕不要返回pointer或reference指向乙個local stack物件(在函式退出前被銷毀)
2. 不要返回pointer或reference指向乙個heap物件(使用者不知道如何delete)
3. 不要返回pointer或者reference指向local static物件而有可能需要多個這樣的物件(同一行不能呼叫多次該函式,static只有乙份)
1. 將成員變數隱藏在函式介面背後,可以為所有可能的實現提供彈性,例如可使得成員變數被讀寫時輕鬆通知其他物件、可以驗證class的約束條件以及函式的前提和事後狀態等。
2.切記將成員變數申明為private,這可具有語法的一致性、更精確的訪問控制、封裝、提供class作者充分的實現彈性等優點
3.protected並不比public更有封裝性
如果不是
private
的。一旦需要改變客戶的一些功能,就會破壞太多客戶碼(需要修改的**更多)。
1.愈多函式可訪問它,資料的封裝性就愈低,故member函式封裝性差
2.將所有便利函式放在多個標頭檔案內但隸屬同乙個命名空間,意味客戶可以輕鬆擴充套件這一組便利函式,降低了編譯依存性,這正是stl的做法
如果你要為某個函式的所有引數(包括被this指標所指的那個隱喻引數)進行型別轉換,啊、那麼這個函式必須是個non-member。
member函式的反面是non-member函式。
1.提供乙個
public swap
成員函式,讓它高效置換你的兩個型別的兩個物件值 2.
在你的class
或template
所在的命名空間內提供乙個
non-member swap
,並令他呼叫上述
swap
函式。
3.如果你正在編寫乙個
class
,為你的
class
特化std::swap
。並令它呼叫你的
swap
成員函式。 4.
如果你呼叫
swap
,請包含
using
宣告式,以便讓
std::swap
在你的函式內**可見,然後不加
namespace
修飾符,赤裸裸的呼叫
Effective C 總結筆記(四)
盡可能延後變數定義式的出現,甚至應該嘗試延後這份定義直到能夠給他初值實參為止,這樣不僅能避免構造和析構非必要物件,避免無意義的default行為,也可增加程式的清晰度並改善程式效率。const cast通常被用來將物件的常量性移除,也是唯一有此能力的c style轉型操作符。dynamic cast...
Effective C 學習筆記(三)
設計與宣告 1.讓介面容易被正確使用,不易被誤用 問題引入 考慮乙個表現日期的建構函式 class date 上述 看似很正確,但對於使用者來說容易犯錯誤,三個引數順序不易區別,如 date d1 30,3,1995 月和日引數顛倒,但程式並不會報錯 date d2 2,30,1995 2月並沒有3...
effective c 讀書筆記 三
資源就是你用了它,最後還要把它換回去。常見的資源包括 記憶體,檔案描述器,互斥鎖,圖形介面中的字形和筆刷,資料庫連線,以及網路sockets。class investment investment createinvestment void f 上述 如果在delete前過早的執行return語句,...