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++不是单一语言,而是四种子语言的联邦:
- C — 基础语法、预处理、数组、指针等
- Object-Oriented C++ — 类、继承、多态、虚函数
- Template C++ — 泛型编程
- 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 | 主题 | 核心要点 |
|---|---|---|
| 1 | C++作为语言联邦 | 四种子语言各有规则 |
| 3 | const的使用 | 逻辑常量性 > 位级常量性 |
| 13 | RAII | 对象管理资源是C++资源管理的基石 |
| 20 | 传值 vs 传引用 | 优先传const引用,内置类型除外 |
| 22 | 数据成员可见性 | private是唯一的真正封装 |
| 23 | 成员 vs 非成员函数 | 非成员非友元函数提供更好封装 |
| 25 | swap | 成员swap + 非成员swap + std::swap特化 |
| 29 | 异常安全 | 基本/强/nothrow三档保证 |
| 35 | 虚函数替代 | NVI、Strategy、Template Method模式 |
与其他书籍的关联
- Effective-Modern-C++-Scott-Meyers.md — Scott Meyers的现代C++续作
- Effective-STL-50条指南-Scott-Meyers.md — Scott Meyers的STL专门著作
- C++-Concurrency-in-Action-2nd-Edition.md — C++并发编程权威
- Cpp-Coding-Standards-101条编码规范-Herb-Sutter-Andrei-Alexandrescu.md — Herb Sutter的编码规范
- Modern-Cpp-Design-Andrei-Alexandrescu.md — Andrei的策略编程经典
行动点
- 检查项目中所有
#define常量,替换为const/enum/inline - 确保所有多态基类的析构函数是
virtual - 为所有资源管理类实现RAII模式
- 审查所有传值参数,考虑改为传const引用
- 为使用了pimpl惯用法的类提供高效的swap
- 审查关键函数的异常安全性,争取强保证
- 熟悉TR1组件(shared_ptr、unordered容器、regex等)