【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函数

  • 见原书
posted @ 2022-04-01 21:14  axingzheng  阅读(32)  评论(0)    收藏  举报