条款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函数