條款一十三:以物件管理資源
1.把資源放進物件內,我們便可依賴c++的「析構函式自動呼叫機制「確保資源被釋放。
2.auto_ptr是個」類指標物件「,也就是所謂」智慧型指標「,其析構函式自動對其所指物件呼叫delete。
voidf()
獲得資源後立即放進資源管理物件內。管理物件運用析構函式確保資源被釋放。
3.由於auto_ptr被銷毀時會自動刪除它所指之物,所以一定要注意別讓多個auto_ptr同時指向同一物件。
4.兩個常被使用的raii class分別是trl::shared_ptr和auto_ptr。前者通常是較佳選擇,因為其copy行為比較直觀。若選擇auto_ptr,複製動作會使它(被複製物)指向null。
條款一十四:在資源管理類中小心coping行為。
條款一十五:在資源管理類中提供對原始資源的訪問。
classfont
//顯示轉換函式
...};
class
font
}
條款一十六:成對使用new和delete時要採取相同形式
1.如果你在new表示式中使用,必須在相應的delete表示式中也使用.如果你在new表示式中不使用,一定不要在相應的delete表示式中使用。
條款一十七:一獨立語句將newd物件置入智慧型指標
1.以獨立語句將newd物件儲存於智慧型指標室內。如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩漏。
條款一十八:讓介面容易被正確使用,不易被誤用
條款一十九:設計class猶如設計type
2.需要考慮物件如何被建立和銷毀;物件的初始化和賦值該有什麼樣的差別;物件如何被pass by value;什麼是物件的合法值;你的新型別是否具有一般化。
條款二十: 寧以pas-by-reference-to-const 替換pass-by-value
1.預設情況下c++以by value方式(乙個繼承自c的方式)傳遞物件至函式。
2.盡量以pas-by-reference-to-const 替換pass-by-value。前者通常比較高效,並可避免切割問題。
3.切割問題:當乙個derived class物件以by value 方式傳遞並被視為乙個base class物件,base class的copy 建構函式會被呼叫,而」造成此物件的行為像個的derived class 物件「的那些特性化性質全被切割掉了,僅僅留下乙個base class物件。
4.以上規則並不適用於內建型別,以及stl的迭代器和函式物件。對它們而言,pass-by-value往往比較適當。
條款二十一:必須返回物件時,別妄想返回其reference
1.絕不要返回point或reference指向乙個local stack物件,或返回reference乙個heap-allocated物件,或返回point或reference指向乙個local static物件而有可能同時需要多個這樣的物件。
條款二十二: 將成員變數宣告為private
條款二十三:寧以non-member、non-friend替換member函式
1.這樣做可以增加封裝性,包裹彈性和機能擴充性。
條款二十四:若所有引數皆需型別轉換,請為此採用non-member函式
1.如果你需要為某個函式的所有引數(包括被this指標所指的那個隱喻引數)進行型別轉換,那麼這個函式必須是個non-member。
條款二十五:考慮寫出乙個不拋異常的swap函式
條款二十六:盡可能的延後變數定義式的出現時間
//方法a:定義迴圈外
widget w;
for(int i=0;ii)
//方法b:定義於迴圈內
for(int i=0;ii)
1.做法a:1個建構函式+1個析構函式+n個賦值操作
做法b:n個建構函式+n個析構函式
2.盡可能延後變數定義式的出現。這樣做可增加程式的清晰度並改善程式效率。
條款二十七:盡量少做轉型動作
條款二十八:避免返回handles指向物件內部成分
條款二十九:為」異常安全「而努力是值得的
1.當異常被丟擲時,帶有異常安全的函式應當:不洩漏任何資源;不允許資料敗壞。
2.異常安全函式提供一下三個保證之一:
1)基本承諾:如果異常被丟擲,程式內的任何事物仍然保持有效狀態下。
2)強烈保證:如果異常被丟擲,程式狀態不改變。
3)不拋擲保證:承諾絕不丟擲異常,因為它們總是能夠完成它們原先承諾的功能。
3.函式提供的「異常安全保證」通常最高只等於其所呼叫各個函式的「異常安全保證」中的最弱者。
條款三十:透徹了解inlining的裡裡外外
1.inline函式背後的整體觀念是,將「對此函式的每乙個呼叫」都以函式本體替換之。這樣就可能增加目標碼的大小。
2.inline只是對編譯器的乙個申請,不是強制命令。這項申請可以隱喻提出,也可以明確提出。隱喻方式是將函式定義於class定義式內。而明確宣告inline函式的做法則是在其定義式前面加上關鍵字inline。
3.將大多數inlining限制在小型、被頻繁呼叫的函式身上。
條款三十一:將檔案間的編譯依存關係降至最低
Effective C 讀書筆記1
條款1 視c 為乙個語言聯邦 今天的c 已經是個多重范型程式語言,乙個支援過程形式 物件導向形式 函式形式 泛型形式 元程式設計形式的語言。為了理解c 必須認識其主要的次語言,總共4個 1.c2.object oriented c 3.template c 4.stl 條款2 盡量以const,en...
Effective C 讀書筆記 1
1.定義式是編譯器對此物件撥發記憶體的地點。2.explicit宣告的建構函式可被用於禁止編譯器執行非預期的型別轉換。注 對於單個引數的建構函式定義了從該形參型別到該型別的乙個 轉換。explicit只對建構函式起作用,用來抑制隱式轉換。class a int function a a 當呼叫 fu...
Effective C 讀書筆記1
tmp 模板元程式設計 0.explicit建構函式比non explicit建構函式好。1.可以用const 來代替 define 定義乙個常量。define沒有作用域,也沒有封裝性。class a const int a num num的定義。在宣告式中已經獲初值,所以無需在定義式給初值。當在類...