《Effective C++》重點摘要(一)

開篇的話

這個星期不再發布關於數據結構的博客,想把半個月來看的書做一些總結,整理整理,第一本就是《Effective C++》。第一次看這本書是一年多前,準備考研複試的時候,隨後陸陸續續,這個月再來看算是第三遍了吧,之前沒有看過《深度探索C++對象模型》,所以有的地方看得不是很透徹(現在有的地方也看得不透,但是比以前好點了)。還有另一本書就是《深度探索C++對象模型》,看第二遍,吸收得更容易了,看書總是這樣,第一遍也許什麼也不知道,但是隻要堅持看下去,回過頭來再讀的時候,許多東西,自然就理解了。
《Effective C++》序列的博客,我將以原書的章爲單位,儘量以描述性的話表達出原書提倡的做法及其這樣做的原因,書中對有些做法的考慮很多,但是我不會記錄那些非常細的,我要做的只是提煉出我認爲比較重要的或者容易記住那些,爲什麼這樣?重要的往往關乎效率和安全,所以足矣警示我們。而容易記住的,則可以更容易爲我們接受,在實踐中運用。在描述的過程中,除了提煉出書中的意思,我還會加入通過《深度探索C++對象模型》得到的理解,也會加入一些關於C++11的內容,C++11對C++98有了不少改進,而《Effective C++》主要是針對C++98的,所以有少許條款可能不再適用於C++11,但是基於C++98的代碼很多很多,學校裏的教學目前也還主要以C++98爲主,所以即便在C++11中不再適用的內容,我也不會去除,僅僅提供在C++11中可行的做法。最後聲明一下:由於本人只是C++的初學者,所以必然有許多不正確的地方,還請指出,我虛心接受,但是拒絕帶有攻擊性的語言,希望大家能夠紳士地交流。

《Effective C++》概述

《Effective C++》由全世界最知名的C++軟件開發專家之一的Scott Meyers所寫,書中以條款的形式列出了使用C++編寫軟件時應該遵循的建議,這種形式引領了以這種形式寫作技術書籍的風潮。全書分爲9章,共有55個條款,涵蓋效率、安全、編程風格、面向對象、語言本身各個方面。各章節標題如下:

  1. 讓自己習慣C++(4條款)
  2. 構造/析構/賦值運算(8條款)
  3. 資源管理(5條款)
  4. 設計與聲明(8條款)
  5. 實現(6條款)
  6. 繼承與面向對象設計(9條款)
  7. 模板與泛型編程(8條款)
  8. 定製new和delete(4條款)
  9. 雜項討論(3條款)

本書的譯者侯捷是我一直非常喜歡的以爲作家,著有700頁的大塊頭《深入淺出MFC》,透徹清晰的《STL源碼剖析》。譯作有《深度探索C++對象模型》、《Effective C++》、《More Effective C++》、《內存受限系統之軟件開發》等等(我只列出了我讀過的)。這些作品質量都很高,很多都是經典之作,非常值得一讀。

《Effective C++》第一章:讓自己習慣C++

  1. C++不是一個純粹的面嚮對象語言,也不是對C的簡單擴展。它是一個混合體,混合了面向對象、面向過程、泛型編程三種形式,各種形式可以混雜使用,也可以單獨使用,所以你鎖採用的編程原則應該根據敲代碼時使用的形式而定。
  2. 儘量使用const、enum、inline替換#define。理由一是這些關鍵字可以清晰地表達意圖。理由二是更安全。理由三是移植程序更方便。所以常量請用const或enum,頻繁使用的小函數請用inline,如果使用不是很頻繁,那麼需要權衡代碼膨脹問題。
  3. 儘可能多地使用const。
    1) const可以控制指針的讀取。主要根據其與號的相對位置確定,如果const在左邊(const Type 和Type const 都是一個意思,都是合法的),那麼指針所指的物不能被修改,如果在右邊則表示指針本身不能被修改,如果兩邊都有,那麼兩者都不能被修改。簡記爲“左物右針”。(如果沒記錯,天平的用法是“左物右碼”☺)。
    2) STL迭代器是以指針爲根據塑模出來的,所以迭代器的作用就像個T*,所以聲明一個const Iterator等價於聲明瞭一個const指針,表示指針本身不能被修改,如果要使迭代器指向的物不能被改變,請使用const_iterator。
    3) 令函數返回一個const型的值,可以降低因用戶錯誤而造成的意外,即讓編譯器發現這些錯誤。前提是返回這個const型的值在語義上是正確的。
    4) 將const作用於成員函數可以表明哪些接口可以改變對象內容,而哪些藉口不能。還可以使“操作const對象”成爲可能。
    5) 返回值的常量性可以作爲函數重載的依據,它表示對函數返回值的讀寫控制。如果返回的是一個常量性的值,那麼這個值就不能被進行寫操作。
    6) 編譯器執行bitwise-constness語義,但是編寫程序時,可能更需要conceptual-constness語義,當心。
    7) 讓返回non-const類型的成員函數調用其const版成員兄弟,以降低代碼的重複,這樣做是安全的,而不是反過來。
  4. 初始化變量。
    1) 讓對象在被使用前都先被初始化。
    2) 初值列表比賦值操作性能更好,所以儘量使用初值列表,但需要注意初值列表中變量在聲明時的順序,初始化順序是與之相同的,而與初值列表中變量的順序無關。base classes更早於其derived classes被初始化。
    3) 爲了免除“跨編譯單元之初始化次序”問題,請以local static對象替換non-local static對象。具體做法是:(1)創建一個類A。(2)編寫一個函數f,在該函數裏聲明一個A類型的靜態對象b,然後返回b的引用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章