EC 學習筆記 五 實現

2022-07-09 13:39:13 字數 2125 閱讀 7133

條款26:盡可能延後變數定義式的出現時間

盡可能延後變數的定義,知道非得使用該變數的前一刻為止

方法a:

widget w;

for (int i = 0; i < n; ++i)

方法b:

for (int i = 0; i < n; ++i)

方法a:乙個建構函式 + 乙個析構函式 + n個賦值操作

方法b:n個建構函式 + n個析構函式

條款27:盡量少做轉型

const_cast(expression):唯一可以將物件的常量性移除(將 const 轉 non-const

)dynamic_cast

(expression):除單元測試可以使用以外,其餘情況禁用

reinterpret_cast

(expression): 指標型別的轉型,較少使用

static_cast

(expression):顯式轉型,最常用,c++中禁用c語言舊式轉型方法

強制函式呼叫使用虛函式的特定版本(規避多型執行),請使用作用域操作符:

virtual

void derived::func(int

x)

派生類虛函式呼叫基類版本時,必須顯式使用作用域操作符

條款28:避免返回handle(reference、pointer、iterator)指向物件內部成分(注意不是函式體內的local變數)

遵守這條規則,可以增加封裝性,規避潛在風險

條款29:為"

異常安全

"而努力是值得的

class

prettymenu;

void prettymenu::changebackground(std::istream&imgsrc)

上面函式沒有異常安全性,因為異常安全性函式:

不洩漏任何資源:上述**中當 new image 發生異常時,互斥器就永遠不會釋放

不允許資料敗壞:上述**中當 new image 發生異常時, imagechange已經被累加,其實新的背景影象並沒有成功安裝

任何使用動態記憶體的東西(例如所有stl容器)如果無法找到足夠記憶體滿足需求,通常會丟擲乙個 bad_alloc 異常

對於上述**,我們使用物件來管理資源(image和mutex):

class

prettymenu;

void prettymenu::changebackground(std::istream&imgsrc)

條款30:透徹了解 inline 的裡裡外外

類的成員函式在類內定義時該函式預設為 inline 函式

inline 函式通常位於標頭檔案內

乙個表面看似 inline 的函式是否真的是 inline,取決你的 build environment,主要取決於編譯器

inline 是個申請,編譯器可以加以忽略,大部分編譯器拒絕將太過複雜的函式、virtual 函式 inline

編譯器通常不對"通過函式指標而進行的呼叫"實施 inline

可以聯想 自定義比較函式comp通過函式指標傳遞給sort,實際上指標呼叫未inline,故sort比qsort快

將大多數 inline 限制在小型(小於10行)被頻繁呼叫的函式身上(注意建構函式、析構函式、虛函式、遞迴函式通常不能 inline)

條款31:將檔案間的編譯依存關係降至最低

如果乙個foo.cc檔案,則最佳的標頭檔案排序方式:(可有效減少隱藏依賴)

foo.h(即原始檔對於的標頭檔案)

c語言標準庫標頭檔案

c++語言標準庫標頭檔案

windows標頭檔案(或者unix標頭檔案)

mfc標頭檔案(或者posix標頭檔案)

第三方專案標頭檔案(例如google開源**標頭檔案、boost標頭檔案)

本專案其他標頭檔案

使用pimpl(pointer to implementation)手法,將介面與實現分離,以"宣告的依存性" 替換 「定義的依存性」

EC 學習筆記 三 資源管理

條款13 以物件管理資源 資源包括 動態分配記憶體 檔案描述符 網路socket 互斥鎖 資料庫連線 把資源放進物件內,可以依賴c 的 析構函式自動呼叫機制 確保資源被釋放 智慧型指標 是乙個 類指標 物件,引用計數型指標,當引用物件數為0時,自動刪除該資源 std shared ptrpclass...

C 學習筆記(五)

今天來學習一下overload 過載 它和override 重寫是有區別的。通常,自然語言中同乙個詞可以代表多種不同的含義,具體含義要依賴上下文來確定。這就是所謂的一次多義 該詞被過載 overload 了。在c 中,還有另外乙個因素會使函式名過載 建構函式。因為建構函式的名字預先由類的名字確定,所...

Qt Model View 學習筆記 五

view 類 概念 在model view架構中,view從model中獲得資料項然後顯示給使用者。資料顯示的方式不必與model提供的表示方式相同,可以與底層儲存資料項的資料結構完全不同。內容與顯式的分離是通過由qabstractitemmodel 提供的標準模型介面,由qasbstractite...