effective C 55個具體做法

2021-10-19 19:37:49 字數 2298 閱讀 7041

2.盡可能使用const、enum、inline替換#define   ===>編譯器替換預處理器  (條款02)

記住:2.1.對於單純常量,最好以const物件或者enum替換#defines.

2.2.對於形似的函式的巨集,最好改用inline函式替換#defines.

3.盡可能使用const,如果關鍵字const出現在星號左邊(const t*),表示被指物是常量;如果出現星號右邊(t* const),表示指標自身是常量。如果出現在兩邊(const t* const )表示被指物和指標都是常量。

3.1 const 加在函式後邊(const int foo()),返回乙個常量值,如果返回變數可被賦值(int foo() = 11),預防沒有意思的賦值行為。

3.2將某些東西宣告為const可以幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內物件、函式引數、函式返回型別、成員函式本體

3.3編譯器強制實施bitwise constness 但你編寫程式時應該是有概念的常量性

3.3當const 和non-const 成員函式有著實質等價實現時,令non-const版本呼叫const版本可避免**重複。(條款03)

4.確定物件被使用前已經初始化,永遠在使用物件前之前先將他初始化。

4.1如果是類,則在建構函式之前將所有值初始化,初始值和賦值不同,初始化是值初始化動作發生在建構函式之前,在建構函式上的叫賦值。

test::test(a a,b b):a(a)  //初始化

(原因系統會為b先初始化初值,再給b賦值效能浪費).

4.2如果遇到出現static,一定要確保staic物件被初始化過,static 物件其壽命從被構造出來直到程式結束為止。注意編譯順序!!!!!

4.3總結

4.3.1為內建物件進行手工初始化,因為c++不保證初始化他們

4.3.2為建構函式最好使用成員初始值,而不要在建構函式本體內使用賦值操作。初始列列出的成員變數,其排列次序應該和他們在class中申明次序相同

4.3.3為避免除"跨編譯單元之初始化次序"問題,請以localstatic物件替換non-local static 物件。(條款04)

5.了解c++默默編寫並呼叫哪些函式

5.1編譯器會為類宣告乙個析構函式,拷貝函式和建構函式和opertor=(預設都是內聯函式)。(條款05)

6.若不想使用編輯器自動生成的函式,就該明確拒絕。

6.1可以將編譯器生成的函式加上private 阻止函式呼叫。

6.2class a

class b:private a

成功阻止友元函式呼叫拷貝函式,這行的同,原因是這些函式」編譯器生成的版本「會嘗試呼叫base class 的對應兄弟,那些呼叫會被編譯器拒絕,因而失敗。

6.3總結

6.3.1為駁回編譯器自動(暗自)提供的機能,可將相應的成員函式宣告為private並且不予實現。

7.為多型基類宣告vritual析構函式

7.1任何class帶有virtual函式幾乎都有乙個virtual析構函式

7.2virtual本身帶有乙個指標占用位元組

7.3拒絕繼承不帶有virtual的class

7.4析構函式的派生方式是最深層的那個class其析構函式最先被呼叫,然後是其每個bass class的析構函式被呼叫。

7.5總結:

7.5.1帶多型性質的baseclass(基類)應該宣告乙個vritual析構函式。如果class帶有任何virtual函式,他就擁有乙個vritual析構函式

7.5.2 class的設計目的如果不是作為base class使用,或者不是為了具備多型行政,就不該宣告為vritual析構函式。(條款07)

8.別讓一場逃離析構函式

8.1c++不禁止析構函式吐出異常,但是不鼓勵你這麼做

8.2總結

8.2.1析構函式絕對不要突出一場。如果乙個被析構的函式呼叫函式可能丟擲異常,析構函式應該無法捕捉異常,然後吞下他們不結束程式

8.2.2如果乙個客戶需要對某個操作函式執行期間丟擲異常的反應,那麼class應該提供(條款08)

9.絕對不在建構函式和析構函式過程中呼叫vritual函式

9.1基類先於派生類被構造 ,由於base class析構函式的執行更早於derived class建構函式,當base class建構函式執行時derived class的成員變數未初始化

9.2在派生類物件的基類物件構造期間,物件的型別是基類而不是派生類

9.3確定你的建構函式和析構函式都沒有呼叫virtual函式。而他們呼叫的所有函式都是服從同一約束。

9.4總結

9.4.1在構造和析構函式期間不要呼叫virtual函式,因為這類呼叫從不下降到派生類(條款09)

Effective C 55條款速記版(下)

每種轉型的作用如下 1.const cast通常被用來將物件的 常量特性轉除 cast away the constness 它也是唯一由此能力的c style轉型操作符。2.dynamic cast主要用來執行 安全向下轉型 safe downcasting 也就是用來決定某物件是否歸屬繼承體系中...

Effective C 的52個條款列表

第一章 從c轉向c 條款1 盡量用const和inline而不用 define 條款2 盡量用而不用 條款3 盡量用new和delete而不用malloc和free 條款4 盡量使用c 風格的注釋 第二章 記憶體管理 條款5 對應的new和delete要採用相同的形式 條款6 析構函式裡對指標成員呼...

Effective C 的52個條款列表

第一章 從c轉向c 條款1 盡量用const和inline而不用 define 條款2 盡量用而不用 條款3 盡量用new和delete而不用malloc和free 條款4 盡量使用c 風格的注釋 第二章 記憶體管理 條款5 對應的new和delete要採用相同的形式 條款6 析構函式裡對指標成員呼...