這個星期不再發布關於資料結構的部落格,想把半個月來看的書做一些總結,整理整理,第一本就是《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++》由全世界最知名的c++軟體開發專家之一的scott meyers所寫,書中以條款的形式列出了使用c++編寫軟體時應該遵循的建議,這種形式引領了以這種形式寫作技術書籍的風潮。全書分為9章,共有55個條款,涵蓋效率、安全、程式設計風格、物件導向、語言本身各個方面。各章節標題如下:
讓自己習慣c++(4條款)
構造/析構/賦值運算(8條款)
資源管理(5條款)
設計與宣告(8條款)
實現(6條款)
繼承與物件導向設計(9條款)
模板與泛型程式設計(8條款)
定製new和delete(4條款)
雜項討論(3條款)
本書的譯者侯捷是我一直非常喜歡的以為作家,著有700頁的大塊頭《深入淺出mfc》,透徹清晰的《stl原始碼剖析》。譯作有《深度探索c++物件模型》、《effective c++》、《more effective c++》、《記憶體受限系統之軟體開發》等等(我只列出了我讀過的)。這些作品質量都很高,很多都是經典之作,非常值得一讀。
c++不是乙個純粹的物件導向語言,也不是對c的簡單擴充套件。它是乙個混合體,混合了物件導向、面向過程、泛型程式設計三種形式,各種形式可以混雜使用,也可以單獨使用,所以你鎖採用的程式設計原則應該根據敲**時使用的形式而定。
盡量使用const、enum、inline替換#define。理由一是這些關鍵字可以清晰地表達意圖。理由二是更安全。理由三是移植程式更方便。所以常量請用const或enum,頻繁使用的小函式請用inline,如果使用不是很頻繁,那麼需要權衡**膨脹問題。
盡可能多地使用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版成員兄弟,以降低**的重複,這樣做是安全的,而不是反過來。
初始化變數。
1) 讓物件在被使用前都先被初始化。
2) 初值列表比賦值操作效能更好,所以盡量使用初值列表,但需要注意初值列表中變數在宣告時的順序,初始化順序是與之相同的,而與初值列表中變數的順序無關。base classes更早於其derived classes被初始化。
3) 為了免除「跨編譯單元之初始化次序」問題,請以local static物件替換non-local static物件。具體做法是:(1)建立乙個類a。(2)編寫乙個函式f,在該函式裡宣告乙個a型別的靜態物件b,然後返回b的引用。
《Effective C 》重點摘要(四)
讓介面容易被正確使用,不易被誤用。乙個介面由返回型別 介面名稱 和引數列表組成,為了讓介面容易被正確的使用,需要小心設計返回型別,最好是簡單 直接 自然。介面名稱選擇很重要,做到簡單 達意 無歧義。引數列表形參型別需要身份小心,如果能防範非法輸入,盡力為之,形參名也盡可能做到同介面名稱一樣的標準。另...
《Effective C 》重點摘要(五)
盡可能延後變數定義式的出現時間。只有變數在恰好要使用之前定義,程式的可讀性往往會得到提高,因為這樣不容易忘記變數說代表的意思。另一方面,這樣做可以提高程式效能,如果不需要乙個變數時卻要為它分配 釋放空間,呼叫構造 析構函式,獲取 釋放資源 這,真是太浪費了。補充一點,宣告式並不會做這些事情,所以可以...
Effective C 摘要 (第1章)
effective c 第一章 c 語言元素 項1 總是使用屬性,不要使用可訪問的資料成員 項2 常數項盡量使用readonly,而不是const 項3 型別裝換時,不要使用強制轉換,使用操作符is或者as 項4 使用conditional標記代替 if條件編譯 項5 給你建立的每個類寫乙個tost...