Effective C++閱讀筆記1

第四章 設計與聲明

條款18讓接口容易被正確使用,不易被誤用;

①重定義接口的類型,比如:

Data(int day, int month, int year);替換爲:Data(Day d, Month m, Year y);這樣的好處在於較好的防止輸入順序出錯;可以對各類型加入束縛值,進一步預防調用出錯,比如Month類別只允許1-12之間的整數類型;

②保持接口的一致性,以及類型與內置類型的行爲兼容,比如:

STL中獲取各容器目前擁有元素數目採用size()函數成員,具有較好的一致性的接口,如果不同容器間有的容器採用size(),有的採用length屬性,將會導致接口一致性變差,使得使用者增加額外的記憶;

③使用shared_ptr消除客戶的資源管理責任;

條款19設計class猶如設計type

該條款提醒類設計者在設計類時,需要關心的問題,構造函數,析構函數,運算符重載,繼承等

條款20pass-by-reference-to-const替換pass-by-value

通過pass-by-value的方式傳遞對象,會導致類的構造函數和析構函數的調用,導致程序的額外開銷增加, C++中內置類型以值傳遞外,其它自定義類型一般都採用常量引用傳遞,另外採用引用傳遞能解決派生類被分割的問題;

條款21必須返回對象時,別妄圖返回其引用;

函數返回值:絕對不要返回局部變量的指針或者引用;不要返回指向一個堆分配對象(new className);不要返回局部靜態對象(local static)的指針或者引用,因爲可能有多個對象同時同時操作該值;
在非要返回對象的時候,就讓函數返回一個新的對象。

條款22將變量聲明爲private

這麼做的好處有:提高類函數訪問的一致性(都以函數形式進行訪問處理);對類實現進行了封裝,當對private成員進行修改時,需要通過函數來實現,因此當需要對數據操作方式進行修改,或者增刪數據時,不影響類使用者編寫的代碼;封裝後的代碼更容易去添加前置條件和後條件的驗證處理;proteted不必pubilc更具封裝性;

條款23使用非成員非友員函數替換成員函數

class WebBrowser  {
	public:
	void clearCache();
	void clearHistory();
	void removeCookies();
}

有用戶想執行所有這些動作,現在有兩種方式:

  • 一種是提供一個類成員函數WebBrowser::clearEverything( );,在函數中調用這三個函數;
  • 另一種方式是採用以各非成員非友員函數,調用者三個函數,代碼如下:
void clearBrowser(WebBrowser& wb)
{
	wb.clearCache();
	wb.clearHistory();
	wb.removeCookies();
}

第二種做法能增加封裝性,對於函數clearBrowser(),可以將其放在一個包含類WebBrowser的命名空間中,或者放在工具類中;這樣做的好處的使得更好的擴展類WebBrowser的相關功能;

條款24若所有參數類型需要轉換,就使用非成員函數

該條款是讓我們,在爲類寫二元操作符的時候,爲了保證操作符的性質,如乘法的交換性,考慮把對應的操作運算重載函數寫爲類的非成員函數;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章