1. 程式人生 > 其它 >【Effective C++】設計與宣告

【Effective C++】設計與宣告

條款18:讓介面容易被正確使用,不易被誤用

  • 見原書

條款19:設計class猶如設計type

  • 一系列準則,見原書

條款20:寧以pass by reference to const替換pass by value

  • pass by reference to const效率高且避免物件切割
  • 內建型別、STL迭代器、函式物件選用pass by value

條款21:必須返回物件時,別妄想返回reference

  • 不要返回local stack物件
  • 返回heap-allocated物件可能會造成資源洩露
  • 返回指向local static物件可能會產生共享等問題

條款22:將變數名稱宣告為private

  • 可以保持訪問的一致性,即呼叫的public介面都是函式,用小括號
  • protected型別與public封裝性一樣(封裝性與內容改變時造成程式碼的破壞量成反比,protected成員在derived物件中仍然可以訪問)

條款23:寧以non-member、non-friend函式替換member函式

  • 越少的函式訪問物件內的資料,封裝性越高
  • non-member、non-friend函式和class定義在同一個名稱空間內增加程式碼的封裝性和擴充能力
  • 名稱空間可以跨原始檔合併

條款24:若所有引數皆需要型別轉換,請為此採用non-member函式

  • 只有引數被列於引數列才能被隱式轉換
 1
class Rational{ 2 public: 3 Rational(int numerator = 0, int denominator = 1); 4 int numerator() const; 5 int denominator() const; 6 7 const Rational operator*(const Rational& ) const; 8 private: 9 //... 10 }; 11 12 Rational oneEight(1, 8); 13 Rational oneHalf(1, 2); 14
Rational result1 = oneHalf * 2; //ok Rational result1 = oneHalf.operator*(2); 15 Rational result2 = 2 * oneHalf; //error Rational result1 = 2.operator*(oneHalf);

條款25:考慮寫出一個不丟擲異常的swap函式

  • 見原書