設(shè)計(jì)與聲明
- 條款 18 - 讓接口容易被正確使用,不易被誤用
- 好的接口容易被正確使用蹄溉,不容易被誤用究恤。你應(yīng)該在你的所有接口中努力達(dá)成這些性質(zhì)崩侠。
- "促進(jìn)正確使用" 的辦法包括接口一致性傀缩,以及與內(nèi)置類型的行為兼容那先。
- "阻止誤" 的辦法包括建立新類型、限制類型上的操作赡艰,束縛對(duì)象值以及消除客戶的資源管理責(zé)任售淡。
- tr1::shared_ptr 可用來(lái)定制刪除器,這可防范 DLL 問(wèn)題慷垮,可被用來(lái)自動(dòng)解除互斥鎖等等揖闸。
- 條款 19 - 設(shè)計(jì) class 猶如設(shè)計(jì) type
- class 的設(shè)計(jì)就是 type 的設(shè)計(jì),在定義一個(gè)新的 type 之前料身,請(qǐng)確定你已經(jīng)考慮過(guò)本條款所覆蓋的所有討論主題:
(1) 新的 type 和對(duì)象應(yīng)該如何被創(chuàng)建和銷毀汤纸。
(2) 對(duì)象的初始化和對(duì)象的賦值該有什么樣的差異。
(3) 新 type 的對(duì)象如果被以值傳遞惯驼,意味著什么蹲嚣。
(4) 什么是新 type 的合法值。
(5) 你的新 type 需要配合某個(gè)繼承圖系嗎祟牲?
(6) 你的新 type 需要什么樣的轉(zhuǎn)換隙畜。
(7) 什么樣的操作符和函數(shù)對(duì)此新 type 是合理的。
(8) 什么樣的標(biāo)準(zhǔn)函數(shù)應(yīng)該駁回说贝。
(9) 誰(shuí)該取用新 type 的成員议惰。
(10) 什么是新 type 的未聲明接口。
(11) 你的新 type 有多么一般化乡恕。
(12) 你真的需要一個(gè)新 type 嗎
- 條款 20 - 寧以 pass-by-reference-to-const 替代 pass-by-value
- 盡量以 pass-by-reference-to-const 替代 pass-by-value言询,前者通常比較高效,并可避免切割問(wèn)題傲宜。
- 以上規(guī)則并不適用于內(nèi)置類型运杭,以及 STL 的迭代器和函數(shù)對(duì)象。對(duì)它們而言 pass-by-value 往往比較恰當(dāng)函卒。
- 條款 21 - 必須返回對(duì)象時(shí)辆憔,別妄想返回其 reference
- 絕對(duì)不要返回一個(gè) pointer 或者 reference 指向 local stack 對(duì)象”ㄇ叮或者返回 reference 指向一個(gè) heap-allocated 對(duì)象虱咧,或者返回 pointer 或者 reference 指向一個(gè) local static 對(duì)象而有可能同時(shí)需要多個(gè)這樣的對(duì)象。條款 4 已經(jīng)為在單線程環(huán)境中合理返回 reference 指向一個(gè) local static 對(duì)象提供一份設(shè)計(jì)實(shí)例锚国。
- 條款 22 - 將成員變量聲明為 private
- 切記將成員變量聲明為 private腕巡。這可賦與客戶訪問(wèn)數(shù)據(jù)的一致性、可細(xì)微劃分訪問(wèn)控制血筑、允許約束條件獲得保證绘沉,并提供 class 以充分的實(shí)現(xiàn)彈性。
- protected 并不比 public 更具封裝性豺总。
- 條款 23 - 寧以 non-member梆砸、non-friend 替換 member 函數(shù)
- 寧可拿 non-member 、 non-friend 函數(shù)替換 member 函數(shù)园欣。這樣做可以增加封裝性帖世、包裹彈性以及機(jī)能擴(kuò)充性。
- 條款 24 - 若所有參數(shù)參數(shù)均需類型轉(zhuǎn)換沸枯,請(qǐng)為此采用 non-member 函數(shù)日矫。
- 如果你要為某個(gè)函數(shù)的所有參數(shù),包括被 this 指針?biāo)傅哪莻€(gè)隱喻參數(shù)绑榴,進(jìn)行類型轉(zhuǎn)換哪轿,那么這個(gè)函數(shù)必須是 non-member 函數(shù)
- 條款 25 - 考慮寫出一個(gè)不拋異常的 swap 函數(shù)
- 當(dāng) std::swap 對(duì)你的類型效率不高時(shí),提供一個(gè) swap 成員函數(shù)翔怎,并確定這個(gè)函數(shù)不會(huì)拋出異常窃诉。
- 如果你提供一個(gè) member swap 杨耙,也該提供一個(gè) non-member swap 用來(lái)調(diào)用前者,對(duì)于 classes 飘痛,也請(qǐng)?zhí)鼗?std::swap
- 調(diào)用 swap 時(shí)應(yīng)針對(duì) std::swap 采用 using 聲明式珊膜,然后調(diào)用 swap ,并不帶任何 “命名空間資格修飾”宣脉。
- 為 “用戶定義類型” 進(jìn)行 std template 全特化是好的车柠,但千萬(wàn)不要在 std 內(nèi)加入某些對(duì) std 而言是全新的東西。