Effective C++(第三版)- 55条指南

原作者: Scott Meyers 原名: Effective C++, Third Edition: 55 Specific Ways to Improve Your Programs and Designs 出版: 2005年,Addison-Wesley ISBN: 978-0-321-51582-7 页数: 321页(mixed类型PDF) 文件大小: 6.38 MB 云盘路径: /books/c++/effective c++/Addison.Wesley.Effective.CPP.3rd.Edition.May.2005.pdf 处理日期: 2026-09-03 处理方法: PDF文本提取(pdf-inspector) 状态: done


核心观点

本书是C++编程领域的经典之作,被广泛认为是学习C++的”第二本书”(读完入门教材后必读)。作者Scott Meyers以55条独立但相互关联的Item形式,系统总结了C++最佳实践。第三版几乎完全重写,超过一半内容是全新的,涵盖C++98标准及TR1扩展。

关键概念与结构

四个子语言联邦(Item 1)

C++不是单一语言,而是四种子语言的联邦:

  1. C — 基础语法、预处理、数组、指针等
  2. Object-Oriented C++ — 类、继承、多态、虚函数
  3. Template C++ — 泛型编程
  4. STL — 容器、迭代器、算法、函数对象

不同子语言有不同的编程规则,例如内置类型适合传值,用户定义类型适合传const引用。

const的正确使用(Item 2-4)

  • 用const/enum/inline替代#define
  • const成员函数应使用”逻辑常量性”而非”位级常量性”
  • 用mutable允许缓存等逻辑不变的操作
  • 用成员初始化列表而非赋值来初始化对象
  • 注意非局部静态对象的初始化顺序问题

构造/析构/赋值运算符(Item 5-12)

  • 理解编译器生成的函数
  • 显式禁用不想要的函数(如Uncopyable基类)
  • 多态基类必须声明虚析构函数
  • 析构函数不能抛出异常
  • 不在构造/析构中调用虚函数
  • 赋值运算符返回*this
  • 处理自赋值
  • 复制对象的所有部分(包括base class)

资源管理——RAII(Item 13-17)

  • RAII(Resource Acquisition Is Initialization):用对象管理资源
  • 复制资源管理对象时要考虑复制行为(深拷贝/引用计数)
  • 为资源管理类提供访问原始资源的方法
  • 配对使用new和delete(同一形式)
  • 将new出来的对象存入智能指针

接口设计(Item 18-25)

  • 让接口易于正确使用,难以误用
  • 类设计就是类型设计
  • 优先传const引用而非传值(内置类型和STL迭代器除外)
  • 需要返回对象时就返回对象,不要返回引用
  • 数据成员声明为private
  • 优先非成员非友元函数而非成员函数(提高封装性)
  • 需要类型转换时声明非成员函数
  • 考虑提供不抛异常的swap支持

实现细节(Item 26-31)

  • 尽可能推迟变量定义
  • 尽量少用cast,优先使用C++风格cast
  • 避免返回指向对象内部的”句柄”
  • 追求异常安全代码(基本保证/强保证/不抛保证)
  • 理解内联的利弊
  • 最小化编译依赖(pimpl惯用法)

继承与OO设计(Item 32-40)

  • 公有继承模型”is-a”关系
  • 避免隐藏继承名称
  • 区分接口继承和实现继承
  • 考虑虚函数的替代方案(NVI、Strategy模式、Template Method模式)
  • 不要重新定义继承的非虚函数
  • 不要重新定义继承的默认参数值
  • 用组合表达”has-a”或”is-implemented-in-terms-of”
  • 谨慎使用私有继承
  • 谨慎使用多重继承

模板与泛型编程(Item 41-48)

  • 理解隐式接口和编译期多态
  • 理解typename的两个含义
  • 访问模板化基类中的名称
  • 将参数无关的代码从模板中分离
  • 使用成员函数模板接受所有兼容类型
  • 需要类型转换时定义模板内的非成员函数
  • 使用traits类获取类型信息
  • 了解模板元编程

定制new和delete(Item 49-52)

  • 理解new-handler的行为
  • 何时替换new和delete
  • 写new和delete时遵守约定
  • 写了placement new就要写placement delete

杂项(Item 53-55)

  • 关注编译器警告
  • 熟悉标准库(包括TR1)
  • 熟悉Boost库

重要数据与结论

Item主题核心要点
1C++作为语言联邦四种子语言各有规则
3const的使用逻辑常量性 > 位级常量性
13RAII对象管理资源是C++资源管理的基石
20传值 vs 传引用优先传const引用,内置类型除外
22数据成员可见性private是唯一的真正封装
23成员 vs 非成员函数非成员非友元函数提供更好封装
25swap成员swap + 非成员swap + std::swap特化
29异常安全基本/强/nothrow三档保证
35虚函数替代NVI、Strategy、Template Method模式

与其他书籍的关联

行动点

  1. 检查项目中所有#define常量,替换为const/enum/inline
  2. 确保所有多态基类的析构函数是virtual
  3. 为所有资源管理类实现RAII模式
  4. 审查所有传值参数,考虑改为传const引用
  5. 为使用了pimpl惯用法的类提供高效的swap
  6. 审查关键函数的异常安全性,争取强保证
  7. 熟悉TR1组件(shared_ptr、unordered容器、regex等)