盡可能延後變數定義式的出現,甚至應該嘗試延後這份定義直到能夠給他初值實參為止,這樣不僅能避免構造和析構非必要物件,避免無意義的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 對於結構體成員的初始化,要區別初始化和賦值的...