Effective C 讀書筆記

2021-07-30 04:47:42 字數 2831 閱讀 4060

(一)讓自己習慣c++

(1)條款01:視c++為聯邦語言

c++的組成可分為四部分:

1.c:c++仍然以c語言為基礎。區塊、語句、預處理、內建資料型別、陣列、指標等都來自c。

2.object-oriented c++:c with classes所訴說的:classes(包括構造和析構)、封裝、繼承、多型、virtual動態繫結等

3.template c++:泛型程式設計

4.stl:template程式庫,對容器、迭代器、演算法以及函式物件的規約有極佳的進你配合和協調。

c++高效程式設計守則視情況而變化,取決於使用c++的那一部分

(2)條款02:盡量以const,enum,inline替換#define

1.#define定義的變數在預處理時就完成了替換(編譯器可能從來沒見過記號名稱),而且#define不在意作用域

2.const定義的語言常量,肯定會被編譯器看到,而且會進入符號表。

3.如果是屬於class的專屬常量,為了將常量的作用於限制在class內,必須讓這個常量成為乙個class的成員,而為了確保常量至多只有乙份實體,必須讓它成為static成員

class

gameplayer

;

通常c++要求對所有使用的東西都要有定義式,但如果它是個class的專屬常量又是static且為整數型別(如int& ,char&,bools等),需要特殊處理。如果不取他們的位址,則可以直接宣告而不需要定義式。但如果取某個class專屬常量的位址或者縱使你不取位址而編譯器堅持要看到乙個定義式,則必須另外提供定義式。

const

int gameplayer::numturns;//numturns的定義

define不僅不能夠用來定義class的專屬常量,而且不能提供封裝。

class

costestimate

;const

double costestimate::fudgefactor = 1.65;//常量定義

如果在編譯期間需要乙個class常量值,此時編譯器不允許進行in-class初值設定,則改用「enmu hack補償法」,理論基礎:乙個屬於列舉型別的數值可充當ints來使用。因為取enum的位址不合法,如果不想讓別人獲得乙個pointer或reference指向你的整型常量,可以用enmu實現這個約束。

使用巨集除了優先順序可能會出現的問題外,(加()也解決不了的問題)

#define

call_with_max(a,b)

f((a)>(b)?(a):(b))

int a = 5,b = 0;

call_with_max(++a,b);//++a累加兩次

call_with_max(++a,b+10);//++a累加一次

//a的累加次數竟然取決於與它比較的物件的值

此時可以利用inline來解決這個問題

1.對於單純常量,最好用const物件或者enmu替換#define

2.對於形似函式的巨集,最好用inline函式替換#define

(3)條款03:盡量使用const

stl的迭代器是以指標為根據塑模出來的,所以迭代器的作用像乙個t*指標,

日如果希望迭代器所指向的東西不可被改動(即希望stl模擬出乙個const t*的指標),需要const_iterator

std::vector

vec;

const

std::vector

::iterator iter = vec.begin();

//iter的作用像t* const

*iter = 10;//沒問題

++iter;//錯誤,因為iter是const

std::vector

::const_iterator citer = vec.begin();

//citer的作用像是個const t*

*citer = 10;//錯誤,*cinter是const的

++citer;//正確

若定義返回值為const,則表示返回值是右值不可以被修改。

(避免出現(a*b) = c)

成員函式如果是const意味著什麼

兩個概念:bitwise constness和logical constness

1.bitwise constness:是c++對常量性的定義,因此const成員函式不可以更改物件內的任何non-static成員變數,但仍會出現間接的改變了成員變數的值

2.logical constness:乙個const成員函式可以修改它所處理的物件內的某些bits,此時可以使用mutable釋放掉non-static成員變數的bitwise constness約束

在const和non-const成員函式中避免重複

如果函式較為複雜(含有邊界檢查,誌記訪問資訊、資料完善性檢查等等同時存放進const和non-const的成員函式,會導致大量重複的編譯、維護工作等等)

真正應該做的是實現成員函式的機能一次並使用兩次,也就是說用其中乙個呼叫另外乙個,這促使我們將常量性轉除

class textbook

};

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...

讀書筆記 Effective C

部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...

Effective C 讀書筆記

h class cpp const int num include include malloc,free new,delete new x,delete x.new x 100 delete x void x set new handler x 設定new記憶體不足時的響應函式 set new h...