Skip to the content.

《Effective C++》规则速览

Scott Meyers 的《Effective C++(第三版)》副标题是“改善程序与设计的 55 个具体做法”,下面按原书顺序列出全部 55 条。

一、让自己习惯 C++

  1. 把 C++ 看作由 C、面向对象 C++、模板 C++ 和 STL 组成的语言联邦。
  2. 尽量用 const、enum 和 inline 替代 #define。
  3. 尽可能使用 const。
  4. 确保对象在使用前已经初始化。

二、构造、析构与赋值

  1. 了解编译器会自动生成和调用哪些特殊成员函数。
  2. 明确禁止使用不需要的编译器生成函数;现代 C++ 使用 = delete。
  3. 多态基类应声明虚析构函数。
  4. 不要让异常逃出析构函数。 // FIXME
  5. 不要在构造函数或析构函数中调用虚函数。
  6. 赋值运算符应返回 *this 的引用。 // FIXME
  7. 在 operator= 中正确处理自赋值。
  8. 复制对象时不要遗漏任何成员或基类部分。

三、资源管理

  1. 使用对象管理资源,即采用 RAII。
  2. 仔细设计资源管理类的复制行为。
  3. 资源管理类应在必要时提供对原始资源的访问。
  4. new 和 delete 的形式必须匹配,数组应使用 new[] 和 delete[]。
  5. 将 new 出来的对象立即放入智能指针,并使用独立语句完成。

四、设计与声明

  1. 让接口容易被正确使用,而且不容易被误用。
  2. 把类的设计当作类型的设计。
  3. 传递对象时优先使用 const 引用,而不是按值传递。
  4. 必须返回新对象时,不要试图返回引用。
  5. 将数据成员声明为 private。
  6. 能用非成员、非友元函数实现时,优先于成员函数。
  7. 若所有参数都需要隐式类型转换,应将相关函数声明为非成员函数。
  8. 考虑提供不抛异常的 swap。 // FIXME

五、实现

  1. 尽可能推迟变量定义,直到真正需要它时。
  2. 尽量少做类型转换。
  3. 避免返回指向对象内部数据的句柄,如引用、指针或迭代器。
  4. 努力编写异常安全的代码。
  5. 理解 inline 的适用场景和代价。
  6. 尽量减少文件之间的编译依赖。

六、继承与面向对象设计

  1. 公有继承必须表达 “is-a” 关系。 // FIXME
  2. 避免遮蔽继承而来的名称。
  3. 区分接口继承与实现继承。
  4. 考虑虚函数以外的设计方案。
  5. 不要重新定义继承而来的非虚函数。
  6. 不要重新定义继承而来的函数默认参数值。
  7. 用组合表达 “has-a” 或 “根据某物实现” 的关系。// FIXME
  8. 谨慎使用私有继承。 // FIXME
  9. 谨慎使用多重继承。

七、模板与泛型编程

  1. 理解隐式接口和编译期多态。
  2. 理解 typename 的两种含义。
  3. 了解如何访问模板化基类中的名称。
  4. 将与模板参数无关的代码移出模板,避免代码膨胀。
  5. 使用成员函数模板接受所有兼容类型。
  6. 需要隐式类型转换时,在类模板内部定义非成员函数。
  7. 使用 traits 类表达和查询类型信息。
  8. 了解模板元编程。

八、定制 new 与 delete

  1. 理解 new-handler 的行为。
  2. 理解何时值得替换 new 和 delete。
  3. 编写自定义 new 和 delete 时遵循惯例。
  4. 编写 placement new 时,也要编写对应的 placement delete。

九、其他

  1. 重视编译器警告。
  2. 熟悉标准库;书中提到的 TR1 已被后续 C++ 标准大体吸收。
  3. 熟悉 Boost,但现代 C++ 中应先检查标准库是否已有对应设施。

阅读备注

  1. template P16
  2. inline P16
  3. static 在 C 语言的中间的作用 和 C++ 中间的作用的如何统一的 ?

  4. 为了的免除 “跨编译单元之初始化的的次序问题” 使用local 对象代替的 non-local 对象

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。