- 讓接口容易被正確使用,不容易被誤用
- 設計一個新的class要考慮的問題:
2.1 新type如何被創建和銷燬——構造函數和析構函數以及內存分配函數和釋放函數
2.2 對象的初始化和賦值該有什麼樣的差別——構造函數和賦值運算符
2.3 對象如果被以值傳遞會發生什麼——拷貝構造函數
2.4 什麼是新type的合法值
2.5 新type需要配合某個繼承圖系嗎?
2.6 新type需要什麼樣的轉換嗎?
2.7 什麼樣的操作符和函數對此type是合理的
2.8 什麼樣的標準函數應該駁回——聲明爲private
2.9 誰該取用新type的成員
2.10 什麼是新type的未聲明接口
2.11 新type有多麼一般化 - 用const引用代替以值傳遞
3.1 提高效率,避免了很多拷貝構造函數的使用
3.2 按引用傳遞可以避免對象切割問題,只有引用和指針纔有多態
3.3 對於內置類型和STL的迭代器和函數對象,按值傳遞效率更高 - 將成員變量聲明爲private。從封裝的角度看,只有兩種訪問權限:private和其他。protected並不比public更具有封裝性
- 愈少代碼可以看到數據,愈多的數據可以被封裝,所以一個non-member non-friend 函數比member函數有更大的封裝性
- 將所有便利函數放在多個頭文件內但隸屬同一個命名空間,意味着客戶可以輕鬆擴展這一組便利函數,只需要添加更多non-member non-friend函數到此命名空間內
- 如果需要爲所有參數進行類型轉換,那麼這個函數必須是non-member
- 可以避免friend就該避免
- C++只允許對class template偏特化,在function template上偏特化是行不通的
- 當std::swap對新type效率不高時,提供一個swap成員函數,並確定這個函數不拋出異常
10.1 如果提供一個member swap,也應該提供一個non-member swap來調用前者。對於classes(而非templates),需要特化std::swap
10.2 調用swap時應針對std::swap使用using聲明式,然後調用swap並且不帶任何“命令空間資格修飾”
10.3 爲“用戶定義類型”進行std templates全特化是好的,但千萬不要嘗試在std內加入某些對std而言全新的東西 - 全特化和偏特化待補充……
Effective C++筆記 —— 第四章
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.