Effective C 總結筆記(四)

2022-09-09 23:00:41 字數 2255 閱讀 4629

盡可能延後變數定義式的出現,甚至應該嘗試延後這份定義直到能夠給他初值實參為止,這樣不僅能避免構造和析構非必要物件,避免無意義的default行為,也可增加程式的清晰度並改善程式效率。

const_cast通常被用來將物件的常量性移除,也是唯一有此能力的c++style轉型操作符。

dynamic_cast主要用來執行「安全向下轉型」,之所以需要

dynamic_castc

,是因為你想在乙個你認定的派生類物件身上執行派生類操作函式,但你只有乙個指向

base class

的指標或引用,需要用這個來進行由上而下的轉換(基類向下轉換成子類)。

reinterpre_cast意圖執行低階轉型,實際動作取決於編譯器。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標,不能將非32bit的例項轉成指標。最普通的用途就是在函式指標型別之間進行轉換,不可移植

static_cast用來強迫隱式轉換,基本什麼都可以轉。但無法轉const->non-const,這個只有const_cast才辦到。適用範圍最廣的,適用於很多隱式轉換,基本資料型別的轉換,基類指標與子類指標的相互轉換,或者新增const屬性,任何型別轉換為void型別,static_cast

在下行轉換時不安全,是因為即使轉換失敗,它也不返回

null

,而dynamic_cast

轉換失敗會返回

null

;對於上行轉換,

dynamic_cast

和static_cast

是一樣的

1. 如果可以,盡量避免轉型,特別是在注重效率的**中避免

dynamic_cast

;試著發展無需轉型的替代設計

2. 如果轉型是必要的,試著將它隱藏於某個函式後。客戶可以呼叫該函式而不需要將轉型放進他們的**中。

3. 寧可使用

c++-style

轉型,不要使用舊式轉型(新式轉型很容易辨識出來,而分門別類)

避免返回handles(包括references、指標、迭代器)指向物件內部(包括成員變數和不被公開的成員函式),否則會破壞封裝性,使const成員函式的行為矛盾,以及發生「空懸虛吊號牌碼」。

當異常被丟擲時,帶有異常安全性的函式會:

不洩露任何資源

不允許資料敗壞

異常安全函式提供一下三個保證之一:

基本承諾:如果異常被丟擲,程式內的任何事物仍然保持在有效狀態下。

強烈保證:如果異常被丟擲,程式狀態不改變。(如果呼叫失敗程式會回到「呼叫函式之前的狀態」)

不拋擲保證:承諾絕不丟擲異常。

可能的話提供「

nothrow

保證」,當「強烈保證」不切實際時,就必須提供「基本保證」。

函式提供的「異常安全保證」通常最高只等於其所呼叫之各個函式的「異常安全保證」中的最弱者

1. public內的成員函式預設是inline,inline函式在大多數c++程式中是編譯器行為。

2. 大部分編譯器拒絕太過複雜的(例如帶有迴圈或者遞迴)的函式inline,而對所有的virtual函式的呼叫都會是inlie落空。

3. inline意味著執行前會將呼叫動作替換為被呼叫函式的主體,需要額外空間,會使**膨脹。

乙個表明inline函式實際是否inline取決於編譯器。inline只是給編譯器的建議,大部分的

編譯器拒絕將太過複雜的函式inlining,隱喻方式是將函式定義於class定義式內

隨著程式庫的公升級,inline函式需要重新編譯,而non-inline函式只需重新連線

將大多數

inlining

限制在小型、被頻繁呼叫的函式身上。

template

的具現化與

inlining

無關(template

放在標頭檔案只是因為一般在編譯器完成具現化動作)

正確做法:

編譯依存最小化的設計策略:

1、如果使用object references或object pointers可以完成任務,就不要用objects

2、如果能夠,以class宣告式替換class定義式

3、為宣告式和定義式提供不同的標頭檔案

Effective C 總結筆記(三)

1.為了防止資源洩漏,請使用raii物件,在建構函式裡面獲得資源,並在析構函式裡面釋放資源.2.引用計數型智慧型指標 rcsp 持續追蹤多少個指標指向該資源,無人指向他時自動刪除該資源,如unique ptr shared ptr和auto ptr 現在已經沒有了,可能改成weak ptr 一般資源...

《Effective C 》讀書筆記(四)

模板以前只是學習的時候寫過一些例子,並沒有真正用過。本人對模板還處於超級小白的狀態,基本看不懂這章,所以就先瀏覽一遍吧,等今後有經驗之後,再回頭看一下模板相關的內容。目前打算下一步學一下stl。a classes和templates都支援介面和多型。b 對於classses中的介面是顯式的,以函式簽...

Effective C 筆記簡易總結以及程式演示

在使用變數時不進行初始化是不好的行為,在程式中有可能讀入乙個未初始化的值就可能導致程式崩潰。對於內建型別,保證在使用物件之前進行初始化 int x 0 const char text a c style string double d std cin d 對於結構體成員的初始化,要區別初始化和賦值的...