原创 More Effective C++ 16:80-20準則

80-20 準則 大約 20%的代碼使用了 80%的程序資源;大約 20%的代碼耗用了大約 80%的運行時間;大約 20%的代碼使用了 80%的內存;大約 20%的代碼執行 80%的磁盤訪問;80%的維護投入於大約 20%的代碼上

原创 More Effective C++ 18:分期攤還期望的計算

這個條款的核心是over-eager evaluation(過度熱情計算法):在要求你做某些事情以前就完成它們. 考慮下面的類,用來表示放有大量數字型數據的一個集合: template<class NumericalType>

原创 More Effective C++ 17:考慮使用懶惰計算法

從效率的觀點來看,最佳的計算就是根本不計算。 懶惰計算法廣泛適用於各種應用領域,從四個部分講述 引用計數 class String { ... }; String s1 = "Hello"; String s2 = s1; //

原创 More Effective C++ 14:審慎使用異常規格

函數unexpected 默認的行爲是調用函數 terminate,而 terminate 默認的行爲是調用函數 abort,所以一個違反異常規格的程序其默認的行爲就是停止運行。在激活的棧中的局部變量沒有被釋放,因爲abort在關

原创 More Effective C++ 13:通過引用捕獲異常

當你寫一個 catch 子句時,必須確定讓異常通過何種方式傳遞到 catch 子句裏。你可以有三個選擇: 1.指針2.傳值3.引用 通過指針 通過指針方式捕獲異常在理論上這種方法的實現對於這個過程來說是效率最高的。因爲在傳遞異常信

原创 More Effective C++ 12:理解“拋出一個異常”與“傳遞一個參數”或“調用一個虛函數”間的差異

從語法上看,在函數裏聲明參數與在 catch 子句中聲明參數幾乎沒有什麼差別: class Widget { ... }; //一個類 void f1(Widget w); // 一些函數,其參數分別爲 void f2(Wid

原创 More Effective C++ 10:在構造函數中防止資源泄漏

如果你正在開發一個具有多媒體功能的通訊錄程序。這個通訊錄除了能存儲通常的文字信息如姓名、地址、電話號碼外,還能存儲照片和聲音。 可以這樣設計: class Image // 用於圖像數據 { public: Image(c

原创 More Effective C++ 11:禁止異常信息傳遞到析構函數外

棧展開(stack-unwinding) 拋出異常時,將暫停當前函數的執行,開始查找匹配的catch子句。首先檢查throw本身是否在try塊內部,如果是,檢查與該try相關的catch子句,看是否可以處理該異常。如果不能處理,就

原创 More Effective C++ 09:使用析構函數防止資源泄漏

假設,你正在爲一個小動物收容所編寫軟件,小動物收容所是一個幫助小狗小貓尋找主人的組織。 … … 每天收容所建立一個文件,包含當天它所管理的收容動物的資料信息, 你的工作是寫一個程序讀出這些文件然後對每個收容動物進行適當的處理. …

原创 More Effective C++ 08:理解各種不同含義的 new 和 delete

string *ps = new string("Memory Management"); 當你寫這樣的代碼,你使用的new是new操作符。 這個操作符就像sizeof一樣是語言內置的,你不能改變它的含義,它的功能總是一樣的。它

原创 More Effective C++ 05:謹慎定義類型轉換函數

C++編譯器允許把 char 隱式轉換爲 int 和從 short 隱式轉換爲 double。因此當你把一個 short 值傳遞給準備接受 double 參數值的函數時,依然可以成功運行。 你對這些類型轉換是無能爲力的,因爲它們是

原创 More Effective C++ 07:不要重載&&,||, 或,

與 C 一樣,C++使用布爾表達式短路求值法. 比如: char *p; ... if ((p != 0) && (strlen(p) > 10)) 這裏不用擔心當 p爲空時 strlen 無法正確運行,因爲如果 p 不等於

原创 More Effective C++ 06:自增、自減操作符前綴形式與後綴形式的區別

重載函數間的區別決定於它們的參數類型上的差異,但是不 論是自增或自減的前綴還是後綴都只有一個參數。爲了解決這個語言問題,C++規定後綴形式有一個 int 類型參數,當函數被調用時,編譯器傳遞一個 0 做爲 int 參數的值給該函數

原创 More Effective C++ 04:避免無用的默認構造函數

在很多時候,對於很多對象來說,不利用外部數據進行完全的初始化是不合理的。比如一個沒有輸入姓名的地址簿對象,就沒有任何意義。 在一些公司裏, 所有的設備都必須標有一個公司ID號碼,所以在建立對象以模型化一個設備時,不提供一個合適的I

原创 More Effective C++ 02:儘量使用C++風格類型的轉換

相比於C++風格類型的轉換,C風格的類型轉換太過粗暴,允許你在任何類型之間進行轉換。 1.例如把一個指向 const 對象的指針轉換成指向非 const 對象的 指針(即一個僅僅去除 const 的類型轉換),把一個指向基類的指針