Effective C 總結筆記(三)

2022-09-09 23:03:27 字數 2452 閱讀 1566

1.為了防止資源洩漏,請使用raii物件,在建構函式裡面獲得資源,並在析構函式裡面釋放資源.

2. 引用計數型智慧型指標(rcsp):持續追蹤多少個指標指向該資源,無人指向他時自動刪除該資源,如unique_ptr、shared_ptr和auto_ptr(現在已經沒有了,可能改成weak_ptr)。

一般資源管理類複製時可以選擇以下做法:

禁止複製(複製不合理)。

「引用計數法」(使用tr1::shared_ptr指定「刪除器」阻止引用次數為0時的刪除行為)。

複製底層資源(「深度拷貝」)。

轉移底部資源的擁有權(auto_ptr)。

apis

往往要求訪問原始資源,所以每乙個

raii class

應該提供乙個「取得其所管理之資源」的辦法。

對原始資源的訪問可能經由顯示轉換或隱式轉換。一般而言顯示轉換比較安全,但隱式轉換對客戶比較方便。

shared_ptr

等智慧型指標的

get成員函式可以實現顯式轉換(安全,受歡迎)返回原始資源指標。

new和delete對應,new[ ]和delete[ ]對應

如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩露。

1.好的介面很容易被正確使用,不容易被誤用;努力達成這些性質

2.「促進正確使用」的辦法包括介面的一致性,以及與內建型別的行為相容;「防治誤用」的辦法包括建立新型別,限制型別上的操作,束縛物件值,以及消除使用者的資源管理責任

3.tr1::shared_ptr支援定製型刪除器,可預防dll問題,可被用來自動解除互斥鎖等等

class的設計就是type的設計,在定義乙個新type之前,回顧本條款的問題。

1. 盡量以pass-by-reference-to-const替換pass-by-value,比較高效,並可避免切割問題

2. 對於內建型別,以及stl的迭代器和函式物件pass-by-value往往更高效

原因:預設情況下

c++以

by value

方式傳遞物件至函式。除非你另外指定,否則函式都是以實際實參的副本為初值,而呼叫端所獲得的亦是函式返回值的副本,而這些副本是由物件的拷貝建構函式產出,會帶來費時操作。

1. 絕不要返回pointer或reference指向乙個local stack物件(在函式退出前被銷毀)

2. 不要返回pointer或reference指向乙個heap物件(使用者不知道如何delete)

3. 不要返回pointer或者reference指向local static物件而有可能需要多個這樣的物件(同一行不能呼叫多次該函式,static只有乙份)

1. 將成員變數隱藏在函式介面背後,可以為所有可能的實現提供彈性,例如可使得成員變數被讀寫時輕鬆通知其他物件、可以驗證class的約束條件以及函式的前提和事後狀態等。

2.切記將成員變數申明為private,這可具有語法的一致性、更精確的訪問控制、封裝、提供class作者充分的實現彈性等優點

3.protected並不比public更有封裝性

如果不是

private

的。一旦需要改變客戶的一些功能,就會破壞太多客戶碼(需要修改的**更多)。

1.愈多函式可訪問它,資料的封裝性就愈低,故member函式封裝性差

2.將所有便利函式放在多個標頭檔案內但隸屬同乙個命名空間,意味客戶可以輕鬆擴充套件這一組便利函式,降低了編譯依存性,這正是stl的做法

如果你要為某個函式的所有引數(包括被this指標所指的那個隱喻引數)進行型別轉換,啊、那麼這個函式必須是個non-member。

member函式的反面是non-member函式。

1.提供乙個

public swap

成員函式,讓它高效置換你的兩個型別的兩個物件值 2.

在你的class

或template

所在的命名空間內提供乙個

non-member swap

,並令他呼叫上述

swap

函式。

3.如果你正在編寫乙個

class

,為你的

class

特化std::swap

。並令它呼叫你的

swap

成員函式。 4.

如果你呼叫

swap

,請包含

using

宣告式,以便讓

std::swap

在你的函式內**可見,然後不加

namespace

修飾符,赤裸裸的呼叫

Effective C 總結筆記(四)

盡可能延後變數定義式的出現,甚至應該嘗試延後這份定義直到能夠給他初值實參為止,這樣不僅能避免構造和析構非必要物件,避免無意義的default行為,也可增加程式的清晰度並改善程式效率。const cast通常被用來將物件的常量性移除,也是唯一有此能力的c style轉型操作符。dynamic cast...

Effective C 學習筆記(三)

設計與宣告 1.讓介面容易被正確使用,不易被誤用 問題引入 考慮乙個表現日期的建構函式 class date 上述 看似很正確,但對於使用者來說容易犯錯誤,三個引數順序不易區別,如 date d1 30,3,1995 月和日引數顛倒,但程式並不會報錯 date d2 2,30,1995 2月並沒有3...

effective c 讀書筆記 三

資源就是你用了它,最後還要把它換回去。常見的資源包括 記憶體,檔案描述器,互斥鎖,圖形介面中的字形和筆刷,資料庫連線,以及網路sockets。class investment investment createinvestment void f 上述 如果在delete前過早的執行return語句,...