條款四十六:需要型別轉換時請為模板定義非成員函式
條款四十七:請使用traits classes 表現型別資訊
1.整合過載技術後,traits classes 有可能在編譯期對型別執行if...else測試。
2.stl共有五種迭代器分類
1)input迭代器只能向前移動一次一步,客戶只可讀取(不能塗寫)它們所指的東西,而且只能讀取一次。(模仿指向輸入檔案的閱讀指標)
2)output迭代器一切只為輸出,它們只向前移動,一次一步,客戶只可塗寫它們所指的東西,而且只能塗寫一次。
3)forward迭代器,可以做input和output所能做的每一件事,而且可以讀或寫其所指物一次以上。
4)bidirectional迭代器比forward更強大,除了可以向前移動還可以向後移動。set.multiset,map,multimap的迭代器都屬於這種。
5)random access迭代器,可以執行迭代器算術。也就是可以在常量的時間內向前或向後跳躍任意距離。(類似於指標算術)vector,deque和string提供的迭代器都是這一分類。
3.迭代器型別的繼承關係圖如下:
條款四十八:認識template元程式設計
1.template metaprogramming(tmp,模板元程式設計)是編寫template-based c++程式並執行於編譯期的過程。
2.tmp有兩個偉大的效力:第一,它讓某些事情更容易。第二,由於template metaprograms執行於c++編譯期,因此可將工作從執行期轉移到編譯期。
3.tmp已被證明是個「圖靈完全」機器。意思好似他的威力大到足以計算任何事物。使用tmp你可以宣告變數、執行迴圈、編寫及呼叫函式。。。但這般構件相對於「正常的」c++對應物看起來很是不同。
4.tmp的起手程式是在編譯期計算階乘。示範如何通過「遞迴模板具現化」實現迴圈,以及如何在tmp中建立和使用變數:
templatestruct5.使用tmp的優勢:factorial;};
template
<>
struct
factorial;};
intmain()
1)確保度量單位正確。
2)優化矩陣運算。
3)可以生成客戶定製之設計模式。
6.template mataprogramming可將工作由執行期移往編譯期,因而得以實現早期錯誤偵測的執行效率。
條款四十九:了解new-handler的行為
1.設計良好的new-handle函式必須做以下事情:
1)讓更多記憶體可被使用。
2)安裝另乙個new-handle。
3)卸除new-handle。
4)丟擲bad-alloc(或派生自bad_alloc)的異常。
5)不返回,通常呼叫abort或exit。
2.set_new_handle允許客戶指定乙個函式,在記憶體分配無法獲得滿足時被呼叫。
條款五十:了解new和delete的合理替換時機
1.主要了解何時可在「全域性性的」或「class專屬的」基礎上合理替換預設的new和delete。
1)為了檢測執行錯誤。
2)為了收集動態分配記憶體之使用統計資訊。
3)為了增加分配和歸還的速度。
4)為了降低預設記憶體管理器帶來的空間額外開銷。
5)為了彌補預設分配器中的非最佳齊位。
6)為了將相關物件成簇集中。
7)為了獲得非傳統的行為。
2.有許多理由需要寫個自定義的new和delete,包括改善效能、對heap運用錯誤進行除錯、收集heap使用資訊。
《effective c 》讀書筆記4
條款41 了解隱式介面和編譯期多型 n classes和templates都支援介面和多型 n 對classes而言介面是顯式的,以函式簽名為中心,多型則是通過虛函式發生於執行期。n 對templates引數而言,介面是隱式的,奠基於有效表示式,多型則是通過template具現化和函式過載解析發生於...
《effective C 》讀書筆記
1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...
Effective C 讀書筆記
一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...