【Effective C++】設計與宣告
阿新 • • 發佈:2022-04-01
條款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函式
- 只有引數被列於引數列才能被隱式轉換
1class 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); 14Rational result1 = oneHalf * 2; //ok Rational result1 = oneHalf.operator*(2); 15 Rational result2 = 2 * oneHalf; //error Rational result1 = 2.operator*(oneHalf);
條款25:考慮寫出一個不丟擲異常的swap函式
- 見原書