程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 《Effective C++》讀書筆記匯總

《Effective C++》讀書筆記匯總

編輯:C++入門知識

《Effective C++》讀書筆記匯總


我之前邊讀《Effective C++》邊寫下每個條款的讀書筆記,這一版是C++11之前的版本。這裡我將每個條款令我印象深刻的點小結一下。

1、C++包括:Plain C(面向過程)、OOP(面向對象)、模板(泛型和模板元編程)、STL(C++標准庫)。

2、用inline、enum、const代替#define。#define定義的宏,一旦復雜起來,高手都很難掌控。不要帶入C的習慣。

3、靈活使用const前綴。不需要進行改變的數據加上const前綴。指針的const前綴有兩種形式,const放在*左邊表示數據不變,放右邊表示指針地址不變。返回不需要修改的成員數據的成員函數需要加上const標記。

4、使用對象前確保初始化。簡單的內置數據結構(POD),有些編譯器都會直接初始化為0。自定義數據結構,尤其是包含指針的類,最好要有明確定義的初始化過程,指針要賦給0或者NULL值。

5、了解C++暗地裡編寫和調用了什麼函數。類會自動生成default 構造函數,copy 構造函數和copy assign函數,如果不明確定義拷貝構造函數,那麼類對象拷貝的時候只進行淺拷貝操作,有可能與原有意圖不符。因此需要明確定義這些函數,不讓C++編譯器自動生成。

6、可以拒絕使用編譯器生成的默認函數。方法是把這些默認函數放到private裡面,這樣程序就無法使用默認函數了。

7、為多態基類聲明virtual析構函數。如果基類沒有定義virtual析構函數,那麼當我們用基類指針指向derived 對象,通過基類指針析構derived對象,無法調用derived對象的析構函數。所以要預先為base類編寫virtual 析構函數,這樣基類和派生類都會執行析構函數。STL不是完全的面向對象思想,比如沒有虛析構函數,因此不能以STL類為基類實現多態。

8、別讓異常逃離析構函數。在處理異常之前,先要保證資源都析構了,不然會發生資源洩露導致bug;如果不行,那麼終止程序是最保險的辦法。保證資源析構的可行的辦法使用資源管理類或者智能指針管理資源。

9、絕不在構造和析構中調用virtual函數。derived實例構造時,base構造部分如果調用virtual函數,則調用的是base類的virtual函數而不是derived類的virtual函數。

10、令operator=返回一個reference to *this。這是標准,很多人會忘記。

11、在operator=中處理“自我賦值”。判斷參數是不是本身,如果是本身,就直接返回,不要做沒用的事情。

12、復制對象不要忘了任何一個成分。因為忘記復制對象是不會報警告和錯誤的,靠開發者自己仔細編寫。

13、以對象管理資源。由於基本數據類型是不存在資源洩露問題的,因此我們可以定義對象的行為使其與基本數據類型相似。讓對象管理資源,讓對象行為類似基本數據類型,這樣就可以像基本數據類型一樣操作自定義對象。資源管理類和智能指針是常用的兩種資源管理對象。

14、在資源管理類中小心coping行為。資源管理類可以有四種coping行為:a禁止復制,比如繼承boost的Uncopyable類b引用計數,不復制資源只是增加一個引用,比如智能指針c復制資源d轉移使用權,比如std::auto_ptr,比較少用。

15、在資源管理類中提供對原始資源的訪問。對資源管理類的最優設計是讓資源管理類用起來和基本數據類型一樣。有必要設計一個好接口用來訪問資源管理類封裝的原始資源。

16、成對使用new/delete要采用相同形式。如果用new,就使用delete;如果用new [],就使用delete [];用malloc申請資源,就用free析構資源。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved