標籤:介面 聲明 設計
18.讓介面容易被正確使用問題:
class Date {public: Date(int month,int day, int year;}
以上代碼問題:
- 容易以錯誤的順序傳遞參數
- 可能傳遞無效的月份或天數
解決方案:
- 通過匯入新類型獲得預防
struct Day { explicit Day(int):val(d){} int val;};class Date {public: Data(const Month& m, const Day& d, const Year& y);};Date d(Month(3), Day(30), Year(1995));
以上代碼無法限制資料範圍
解決方案:
class Month { public: static Month Jan() {return Month(1);} static Month Feb() {return Month(2);} private: explicit Month(int m); };Date d(Month::Feb(), Day(30), Year(1995));
介面設計原則
- 介面不容易被誤用
- 建立新類型
- 限制類型上的操作
- 消除客戶的資源管理責任
- 介面一致性
- stl容器都有一個size介面
- 不要有的時length,有的是size
- 任何介面如果要求客戶必須記得做某事,會有不正確使用傾向
// 會導致忘記刪除指標Investment* createInvestment();// 解決方案,儲存到智能指標// 客戶會忘記儲存的到智能指標// 解決方案:函數返回智能指標auto_ptr<Investment> createInvestment()
19.設計class猶如設計type需要考慮的問題:
- 新type對象該如何建立和銷毀
- 建構函式,解構函式
- operator new,operator delete, operator new[] operator delete[]
- 對象初始化和對象賦值有什麼區別
- 新type的對象如果被pass by value,意味著什嗎?
- 什麼時新type的合法值
- 新type需要配合某個繼承圖系嗎
- 如果繼承某個既有類,受到該類的影響,特別時virtual,non-virtual的影響
- 如果容許其他類繼承,影響你所聲明的函數,尤其時解構函式是否為virtual
- 你的type需要什麼樣的轉換
- T1需要轉換為T2,T1內寫類型轉換函式operator T2,或著T2內寫non-explicit 建構函式
- 轉換是否需要為explicit的函數
- 什麼樣的操作符和函數是合理的
- 該誰取用新的type的成員
- public,protected,private,friend
- 你的新type有多麼一般化
20.寧以pass-by-reference-to-const替代pass-by-value使用pass-by-value問題
- 傳遞的類對象執行copy建構函式,造成效能低下
- 類對象內部的成員變數執行copy建構函式,造成效能低下
解決方案:
- 傳遞常量引用
- 傳遞引用可以避免切割發生(切割後virtual函數調用的是基類的virtual函數)
- 對於內建對象,pass-by-value更高效
- 小型的類對象,pass-by-reference更高效
- 編譯器可能不會對小型類對象最佳化
- 類對象大小隨著需求增加可能會變化,會變為大的類對象
Effective C++ -- 設計與聲明