《Effective C 》重點摘要(四)

2021-07-01 23:07:26 字數 1623 閱讀 9027

讓介面容易被正確使用,不易被誤用。乙個介面由返回型別、介面名稱、和引數列表組成,為了讓介面容易被正確的使用,需要小心設計返回型別,最好是簡單、直接、自然。介面名稱選擇很重要,做到簡單、達意、無歧義。引數列表形參型別需要身份小心,如果能防範非法輸入,盡力為之,形參名也盡可能做到同介面名稱一樣的標準。另外請保持命名習慣的一致性也能收到奇效。

設計class猶如設計type。使用者對語言內建的type支援的行為一般十分熟悉,所以最好自行設計的class能夠像內建type一樣,讓使用者使用起來得心應手。為了做到這個,可以問自己下面這些問題:

1) 新type物件如何被建立和銷毀?

2) 物件的初始化和物件的賦值該有什麼差別?

3) 新type的物件如果被pass-by-value,意味著什麼?

4) 什麼是新type的「合法值」?

5) 新type需要配合某個繼承圖系嗎?

6) 新type需要什麼樣的轉換?

7) 什麼樣的操作符和函式對此新type而言是合理的?

8) 什麼樣的標準函式應該駁回?需要拒絕的或是該宣告為private的?

9) 新type的成員訪問許可權是否合理?

10) 什麼是新type的為宣告介面?它對效率、異常安全、資源利用提供何種保證?

11) 新type有多麼一般化?需要template嗎?

12) 這個新type真的是需要的嗎?

寧以pass-by-reference-to-const替換pass-by-value。以const引用作為引用的第一理由是安全,不會發生物件切割,第二理由是高效。但是語言內建的簡單型別還是以值傳遞比較高效。

必須返回物件時,別妄想返回其reference。為了效率返回引用……額,別想了,函式內部的區域性變數在函式結束時會被析構的,引用怎麼可以指向乙個沒有存在的物件呢?返回指標?可以是可以,但是誰保證釋放這個指標指向的記憶體,並且這種方法也不一定總是有效。也許你可以利用raii,返回乙個智慧型指標。但是,最好還是返回物件吧,請放心,編譯器可以使用nrv優化幫你分擔一部分效能憂慮。

將成員變數宣告為private。封裝得越多,實現者可以在幕後做更多手腳而不影響客戶端**;為封裝的成員變數提供訪問的函式介面,給使用者更一致的使用風格;protected並不比public更具有封裝性,因為它在子類中就像public一樣。c++中只有兩種訪問許可權:封裝的(private)和不封裝的。

寧以non-member且non-friend替換member函式。這乙個條款真的不適合幾句話說清楚,這裡我想說的是如果發現某個成員函式只是呼叫一串行public型別的函式來完成功能,那麼就把它編寫為乙個non-member且non-friend函式。這樣可以帶來更大的封裝性、包裹彈性和機能擴充性,降低編譯依賴性。具體原因非常精彩,將以另一篇博文呈現。

若所有引數皆需要型別轉換,請為此採用non-member函式。比如為複數類過載乙個乘法運算子(*),如果作為乙個member函式,那麼第一引數this將不能輕鬆實現轉型,所以為了便利,將其實現為乙個non-member函式會讓日子過得更輕鬆一點。

考慮寫出乙個不拋異常的swap函式。應該實現乙個member版的swap函式,然後再實現乙個non-member版的swap函式,讓non-member版呼叫member版swap函式,一般情況下,這樣做是為了copy-and-swap技術,從而做到異常安全,於是,不應該讓swap函式丟擲異常。

《Effective C 》重點摘要(一)

這個星期不再發布關於資料結構的部落格,想把半個月來看的書做一些總結,整理整理,第一本就是 effective c 第一次看這本書是一年多前,準備考研複試的時候,隨後陸陸續續,這個月再來看算是第三遍了吧,之前沒有看過 深度探索c 物件模型 所以有的地方看得不是很透徹 現在有的地方也看得不透,但是比以前...

《Effective C 》重點摘要(五)

盡可能延後變數定義式的出現時間。只有變數在恰好要使用之前定義,程式的可讀性往往會得到提高,因為這樣不容易忘記變數說代表的意思。另一方面,這樣做可以提高程式效能,如果不需要乙個變數時卻要為它分配 釋放空間,呼叫構造 析構函式,獲取 釋放資源 這,真是太浪費了。補充一點,宣告式並不會做這些事情,所以可以...

Effective C 摘要 (第1章)

effective c 第一章 c 語言元素 項1 總是使用屬性,不要使用可訪問的資料成員 項2 常數項盡量使用readonly,而不是const 項3 型別裝換時,不要使用強制轉換,使用操作符is或者as 項4 使用conditional標記代替 if條件編譯 項5 給你建立的每個類寫乙個tost...