c++的各種能力和特性使它成為乙個無可匹敵的工具,但也可能引發某些迷惑:所有「適當用法」似乎都有例外。我們該如何理解這種語言呢?最簡單的辦法就是將c++視為有相關語言組成的聯邦而非單一語言。在它的某個次語言中,各種規則與通例都相對簡單。然而從乙個次語言移往另乙個次語言,守則可能改變。
c++主要的次語言有四個:
所到底c++以c為基礎。區塊、語句、預處理器、內建資料型別、陣列、指標等都來自c語言。許多時候c++對問題的解法其實就是較高階的c的解法:例如條款02談到預處理器之外的另一選擇;條款13談到以物件管理資源。但當你以c++內的c成分工作時,高效程式設計守則會反映出c語言的侷限:沒有模版(templates),沒有異常(exceptions),沒有過載
(overloading)…。
類、封裝、繼承、多型、虛函式…。這一部分是物件導向設計之古典守則在c++上的最直接實施。
這是c++的泛型程式設計的部分。泛型程式設計讓你編寫完全一般化並可重複使用的演算法,其效率與針對某特定資料型別而設計的演算法相同。泛型程式設計最初誕生於c++中,目的是為了實現c++的stl(標準模板庫)。其語言支援機制就是模板(templates),模板的精神其實很簡單:引數化型別。換句話說,把乙個原本特定於某個型別的演算法或類當中的型別資訊抽掉,抽出來做成模板引數t。
stl是個templates程式庫,但卻是非常特殊的乙個。它的乙個重要特點是資料結構和演算法的分離。儘管這是個簡單的概念,但這種分離確實使得stl變得非常通用。stl另乙個重要特性是它不是物件導向的,為了具有足夠通用性,主要依賴於模板而不是封裝,繼承和虛函式(多型性),這好像是一種倒退,但這正好是使得stl的元件具有廣泛通用性的底層特徵。stl有自己的辦事方式,當你夥同它一起工作,你必須遵守它的規約。
記住這四個次語言,當你從乙個切換到另乙個,導致高效程式設計守則要求你改變策略時,不要感到驚訝。因此,c++不是乙個帶有一組守則的一體語言,而是乙個語言聯邦**,每個次語言都有自己的規約。
Effective C 筆記 條款11
為什麼會出現自我賦值呢?不明顯的自我賦值,是 別名 帶來的結果 所謂 別名 就是 有乙個以上的方法指涉物件 一般而言如果某段 操作pointers或references而它們被用來 指向多個相同型別的物件 就需要考慮這些物件是否為同乙個。實際上兩個物件來自同乙個繼承體系,它們甚至不需要宣告為相同型別...
Effective C 筆記 條款09
為方便採用書上的例子,先提出問題,在說解決方案。class transaction 7 8 transaction transaction base class 的建構函式之實現9 13 14 class buytransaction public transaction 假設在程式中 buytra...
Effective C 筆記 條款08
c 並不禁止析構函式吐出異常,但它不鼓勵你這樣做。考慮如下 class widget 假設這個可能吐出乙個異常5 6 7 void dosomething 8 當vector v被銷毀,它有責任銷毀其內含的所有widgets。銷毀第乙個丟擲異常,銷毀第二個丟擲異常 異常對c 而言太多了。其實,在兩個...