【Effective C++ 第三版】第 9 篇:杂项讨论 + 总结 —— 55 条款的工程哲学(条款 53-55 + 系列回顾)
一句话核心结论:C++ 55 个条款的核心哲学可以浓缩为 4 句话——“编译器是你的朋友,不是敌人”、“RAII 是 C++ 资源管理的灵魂”、“const 是契约,类型是文档”、“标准库是最好的老师,Boost 是 C++ 的未来”。本章 3 个条款 + 全文总结带你走完 Effective C++ 第三版之旅。
系列导航
| # | 文章 | 状态 |
|---|---|---|
| 0 | 系列总览 | ✅ 已发布 |
| 1 | 让自己习惯 C++ | ✅ 已发布 |
| 2 | 构造/析构/赋值 | ✅ 已发布 |
| 3 | 资源管理 | ✅ 已发布 |
| 4 | 设计与声明 | ✅ 已发布 |
| 5 | 实现 | ✅ 已发布 |
| 6 | 继承与 OOP | ✅ 已发布 |
| 7 | 模板与泛型 | ✅ 已发布 |
| 8 | 定制 new / delete | ✅ 已发布 |
| 9 | 本文:杂项 + 总结 | ✅ 已发布 |
前言:为什么”杂项”也重要?
Effective C++ 第 9 章只有 3 个条款——但每一个都是”看不见但致命”的工程哲学:
- Compiler warnings——你写的代码”对未来编译器”是错的
- 标准库——不要重复发明轮子
- Boost——C++ 的”未来标准”
这 3 个条款是”价值观”——决定了你的代码是否能活得久、跑得稳、跟得上时代。
一、条款 53:不要轻视编译器的警告
1.1 案例:warning 不是噪音
1 | class Base { |
编译器的 warning:
1 | warning: 'Derived::f' hides virtual 'Base::f' [-Woverloaded-virtual] |
1.2 警告 vs 错误
| 类型 | 含义 | 行动 |
|---|---|---|
| error | 编译失败 | 必须修 |
| warning | 编译通过,但”可能有问题” | 应该修 |
反直觉:
- 警告是”未来版本的错误”——升级编译器就报错
- 警告是”跨平台的错误”——某些平台/编译器/版本会失败
- 警告是”优化的线索”——编译器比你更懂
1.3 实战原则
1 | // 1. 最高警告等级 |
1.4 “不沉默”的最高境界
1 | // ❌ 沉默的 bug |
1.5 关键启示
- warning 是”编译器想告诉你的事”——不要忽视
- 开发期
-Werror——把 warning 当 error - 跨编译器测试——不同编译器找不同问题
- CI 加 ASan / UBSan / TSan——找运行期问题
二、条款 54:让自己熟悉包括 TR1 在内的标准程序库
2.1 C++ 标准库的全景(C++11 之后)
| 类别 | 包含 |
|---|---|
| 容器 | vector、list、deque、map、set、unordered_map、array、forward_list |
| 算法 | sort、find、transform、accumulate |
| 迭代器 | iterator、reverse_iterator、move_iterator |
| 函数对象 | function、bind、function、hash |
| 智能指针 | unique_ptr、shared_ptr、weak_ptr |
| 正则 | regex |
| 随机数 | random、default_random_engine |
| 时间 | chrono::duration、chrono::time_point |
| 并发 | thread、mutex、condition_variable、atomic |
| 文件系统(C++17) | filesystem::path、directory_iterator |
| 可选类型(C++17) | optional、variant、any |
| 协程(C++20) | co_await、co_yield |
| 模块(C++20) | import / export |
2.2 “自己造轮子”的反例
1 | // ❌ 自己写 unique_ptr |
优势:
- 标准库经过亿级项目验证
- 编译器深度优化标准库
- 代码可读性更高
- 跨平台一致
2.3 何时”自己造”?
- 标准库没有(如 GPU 内存管理)
- 标准库太慢(需要 profile 证实)
- 标准库语义不对(如自定义内存池)
2.4 关键启示
- 先看标准库——90% 已有
- 不会用?查 cppreference.com
- C++11/14/17/20 加了很多好用的库
- “不重复造轮子”是金科玉律
三、条款 55:让自己熟悉 Boost
3.1 什么是 Boost?
Boost = 准标准 C++ 库——很多 Boost 库最终被纳入 C++ 标准(如 shared_ptr、function、unordered_map 都来自 Boost)。
3.2 Boost 库的 3 大类
| 类别 | 例子 |
|---|---|
| C++ 标准的”预演” | shared_ptr、function、regex |
| 跨平台的”工具” | filesystem、thread、asio(网络) |
| 前沿研究 | hana(元编程)、spirit(解析器) |
3.3 Boost 中的”明星库”
| 库 | 用途 | 标准? |
|---|---|---|
boost::shared_ptr | 智能指针 | C++11 |
boost::function | 函数包装 | C++11 |
boost::bind | 函数绑定 | C++11 std::bind |
boost::unordered_map | 哈希表 | C++11 |
boost::regex | 正则 | C++11 |
boost::thread | 线程 | C++11 |
boost::filesystem | 文件系统 | C++17 |
boost::asio | 网络 | 第三方 |
boost::hana | 元编程 | 第三方 |
boost::spirit | 解析器 | 第三方 |
3.4 实战:用 Boost.Asio 写一个 echo server
1 |
|
3.5 关键启示
- Boost = C++ 标准的”候选库”——质量高
- Boost.Asio 是网络编程的事实标准
- 学习 Boost = 学习 C++ 的前沿
- boost.org——找库的最好地方
四、整个 Effective C++ 系列的回顾
4.1 9 大主题回顾
graph TB
A["Effective C++ 55 条款"] --> B["让自己习惯 C++\n条款 1-4"]
A --> C["构造/析构/赋值\n条款 5-12"]
A --> D["资源管理\n条款 13-17"]
A --> E["设计与声明\n条款 18-25"]
A --> F["实现\n条款 26-31"]
A --> G["继承与 OOP\n条款 32-40"]
A --> H["模板与泛型\n条款 41-48"]
A --> I["定制 new/delete\n条款 49-52"]
A --> J["杂项\n条款 53-55"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#333
style F fill:#FFF9C4,stroke:#F9A825,color:#333
style G fill:#C7CEEA,stroke:#9FA8DA,color:#333
style H fill:#E8D5F5,stroke:#CE93D8,color:#333
style I fill:#FFDAB9,stroke:#FFAB76,color:#333
style J fill:#FFB3C6,stroke:#F48FB1,color:#3334.2 55 条款的”4 大哲学”
哲学 1:编译器是你的朋友
- 条款 05-06:编译器生成/拒绝函数
- 条款 12:复制对象时勿忘成分
- 条款 30:inline 是请求
- 条款 31:最小化编译依赖
- 条款 53:不要忽视警告
哲学 2:RAII 是 C++ 资源管理的灵魂
- 条款 13-17:5 个 RAII 条款
- 条款 25:noexcept swap
- 条款 29:异常安全
哲学 3:const 是契约,类型是文档
- 条款 03-04:const 正确性
- 条款 18:易用且难误用
- 条款 19:class = type
- 条款 22:private 成员
- 条款 24:对称操作符
- 条款 27:少做转型
哲学 4:标准库是最好的老师
- 条款 23:non-member、non-friend
- 条款 32-40:继承的 3 种关系
- 条款 41-48:模板的力量
- 条款 54:熟悉标准库
- 条款 55:熟悉 Boost
4.3 55 条款的”3 个层次”
graph TB
A["55 条款的 3 个层次"] --> B["基础层\n(C++ 的"是什么")"]
A --> C["进阶层\n(C++ 的"怎么用")"]
A --> D["哲学层\n(C++ 的"为什么")"]
B --> B1["条款 1-4\n基本习惯"]
B --> B2["条款 5-12\n对象生命周期"]
B --> B3["条款 13-17\nRAII"]
C --> C1["条款 18-25\n接口设计"]
C --> C2["条款 26-31\n实现细节"]
C --> C3["条款 49-52\n内存管理"]
D --> D1["条款 32-40\n继承与 OOP"]
D --> D2["条款 41-48\n模板与泛型"]
D --> D3["条款 53-55\n杂项 / 标准库"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#333
style B1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style B2 fill:#B5EAD7,stroke:#80CBC4,color:#333
style B3 fill:#B5EAD7,stroke:#80CBC4,color:#333
style C1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style C2 fill:#B5EAD7,stroke:#80CBC4,color:#333
style C3 fill:#B5EAD7,stroke:#80CBC4,color:#333
style D1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style D2 fill:#B5EAD7,stroke:#80CBC4,color:#333
style D3 fill:#B5EAD7,stroke:#80CBC4,color:#3334.4 55 条款一览表
| 条款 | 主题 | 关键词 |
|---|---|---|
| 01 | C++ 是语言联邦 | 4 个子语言 |
| 02 | const/enum/inline 替代 #define | 编译器视角 |
| 03 | 尽可能使用 const | const 正确性 |
| 04 | 对象使用前先初始化 | 构造顺序 |
| 05 | 编译器默默生成的函数 | 4 个函数 |
| 06 | 拒绝编译器自动生成的函数 | = delete |
| 07 | 多态基类声明 virtual 析构 | 多态删除 |
| 08 | 别让异常逃离析构 | noexcept |
| 09 | 构造/析构中勿调 virtual | vptr 时机 |
| 10 | operator= 返回 *this | 链式赋值 |
| 11 | operator= 处理自我赋值 | copy-and-swap |
| 12 | 复制对象勿忘每个成分 | 拷贝完整 |
| 13 | 以对象管理资源 | RAII |
| 14 | 资源管理类的 copying | 拷贝语义 |
| 15 | 提供对原始资源的访问 | get() |
| 16 | new/delete 形式匹配 | 数组 vs 标量 |
| 17 | 独立语句 new 出智能指针 | 异常安全 |
| 18 | 接口易用且难误用 | 类型系统 |
| 19 | class 犹如 type | 11 问 |
| 20 | pass-by-const-ref 替代 value | 性能 |
| 21 | 返回对象时别返回 ref | RVO |
| 22 | 成员变量声明为 private | 封装 |
| 23 | non-member、non-friend | 工具函数 |
| 24 | 类型转换时用 non-member | 对称操作符 |
| 25 | noexcept swap | copy-and-swap |
| 26 | 延后变量定义 | 避免白构造 |
| 27 | 少做转型 | 4 种 cast |
| 28 | 避免返回 handles | 内部成分 |
| 29 | 异常安全 | 3 个保证 |
| 30 | 了解 inline | 隐式 inline |
| 31 | 最小化编译依赖 | pimpl |
| 32 | public 继承塑模 is-a | Liskov |
| 33 | 避免遮蔽继承的名字 | using |
| 34 | 接口继承与实现继承 | 3 种虚函数 |
| 35 | virtual 以外的选择 | NVI / 策略 |
| 36 | 绝不重定义 non-virtual | 静态绑定 |
| 37 | 绝不重定义缺省参数 | 静态绑定 |
| 38 | 复合塑模 has-a / is-impl | 优先复合 |
| 39 | 审慎使用 private 继承 | 3 个场景 |
| 40 | 审慎使用多重继承 | 多接口 |
| 41 | 隐式接口与编译期多态 | 模板多态 |
| 42 | typename 的双重含义 | 嵌套类型 |
| 43 | 模板化基类的名称 | this-> / using |
| 44 | 抽离与参数无关的代码 | 模板膨胀 |
| 45 | 成员函数模板接受兼容类型 | 智能指针 |
| 46 | 类型转换时模板用 friend | operator |
| 47 | traits classes 表现类型信息 | 编译期查询 |
| 48 | 认识 template 元编程 | 编译期计算 |
| 49 | 了解 new-handler | 失败回调 |
| 50 | new/delete 替换时机 | 6 个理由 |
| 51 | new/delete 固守常规 | 8 条铁律 |
| 52 | placement new 配套 delete | 异常安全 |
| 53 | 不要轻视编译警告 | 跨平台 |
| 54 | 熟悉标准库 | 不造轮子 |
| 55 | 熟悉 Boost | C++ 未来 |
五、C++ 工程实战:4 大主题
5.1 主题 1:性能优化
| 优化点 | 条款 | 关键点 |
|---|---|---|
| 传值 → 传 const ref | 20 | 默认参数传递 |
| 拷贝 → 移动 | 25, 41 | RVO + 移动构造 |
| 虚函数 → 模板 | 35, 41 | 编译期多态 |
| 模板膨胀 | 44 | 抽基类共享 |
| 内存池 | 50, 51 | 自定义 new/delete |
| 内联 | 30 | 小函数 / 模板 |
5.2 主题 2:内存安全
| 安全点 | 条款 | 关键点 |
|---|---|---|
| 拒绝拷贝 | 06 | = delete |
| 资源管理 | 13-17 | 智能指针 |
| 异常安全 | 29 | copy-and-swap |
| 析构不抛 | 08 | noexcept |
| placement delete | 52 | 配套使用 |
| 内存池 | 50, 51 | 减少碎片 |
5.3 主题 3:API 设计
| 设计点 | 条款 | 关键点 |
|---|---|---|
| 易用且难误用 | 18 | 强类型 |
| 接口易扩展 | 19, 22-23 | private + non-member |
| 编译稳定 | 31 | pimpl + 前向声明 |
| 性能承诺 | 25, 29 | noexcept + 强异常保证 |
| 模板友好 | 41-48 | traits + 隐式接口 |
5.4 主题 4:现代 C++
| 现代化 | 条款 | 关键点 |
|---|---|---|
= default / = delete | 05, 06 | C++11 |
| 智能指针 | 13-17 | C++11 |
| 移动语义 | 25, 29, RVO | C++11 |
auto | 41-48 | C++11 |
if constexpr | 47-48 | C++17 |
concepts | 41-48 | C++20 |
modules | 31 | C++20 |
std::span / std::format | 18 | C++20 |
六、面试宝典
6.1 顶级 C++ 面试题(55 条款浓缩)
基础(5 题)
- C++ 是什么?——“语言联邦”:C / OOP C++ / Template C++ / STL
- 为什么 const 重要?——契约、文档、编译器优化
- 什么是 RAII?——Resource Acquisition Is Initialization
- 智能指针有哪些?——
unique_ptr/shared_ptr/weak_ptr
进阶(10 题)
- Rule of Three——析构 + 拷贝构造 + 拷贝赋值 三者要么都不写,要么都写
- Rule of Five——C++11 起:+ 移动构造 + 移动赋值
- Rule of Zero——用标准库管资源,自己不写
- 多态基类为什么 virtual 析构?——
delete base_ptr才正确 - 什么是 pimpl?——
unique_ptr<Impl>隐藏实现 - operator= 怎么处理自我赋值?——copy-and-swap
- pass-by-value vs pass-by-const-ref?——默认 const&,内置类型/迭代器传值
- 什么时候用 private 继承?——protected 访问 / 虚函数重写 / EBO
- 什么是 copy-and-swap?——
T& operator=(T rhs) { swap(rhs); return *this; } - NVI 模式?——public non-virtual 包 private virtual
高阶(10 题)
- Liskov 替换原则?——派生类必须能完全替代基类
- public 继承 vs 复合?——is-a 用继承;has-a/is-impl 用复合
- 菱形继承怎么处理?——虚继承
- 虚函数的缺省参数为什么不能重写?——静态绑定
- 为什么模板不支持隐式转换?——参数推导时不做;用 friend 模板
- 什么是 traits?——编译期类型查询
- 什么是 TMP?——Template Meta-Programming;C++17+ 用
if constexpr - placement new 配套什么?——placement delete
- operator new 失败时调什么?——new-handler
- C++20 concepts 是什么?——模板约束的”声明式”语法
6.2 实战题(5 题)
- 实现一个
unique_ptr(核心:移动构造 += delete拷贝) - 实现一个
shared_ptr(核心:引用计数 + 循环引用) - 实现
pimpl模式(核心:前向声明 + 移动语义) - 实现一个简单的 traits(核心:模板特化)
- 实现一个异常安全的 operator=(核心:copy-and-swap)
七、学习路径推荐
7.1 初学者路径(3-6 个月)
graph LR
A["C++ Primer\n(第 5 版)"] --> B["Effective C++\n(第 3 版)"]
B --> C["More Effective C++"]
C --> D["Effective Modern C++"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#3337.2 进阶路径(6-12 个月)
graph LR
A["C++ Templates\n(第 2 版)"] --> B["Modern C++ Design\n(Alexandrescu)"]
B --> C["C++ Concurrency in Action"]
C --> D["C++ 标准库\n(Nicolai Josuttis)"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#3337.3 高手路径(持续)
graph TB
A["ISO C++ 委员会文档\n(isocpp.org)"]
B["CppCon 视频\n(youtube)"]
C["C++ Weekly\n(Jason Turner)"]
D["github.com/isocpp/CppCoreGuidelines"]
E["Compiler Explorer\n(godbolt.org)"]
style A fill:#B5EAD7,stroke:#80CBC4,color:#333
style B fill:#B5EAD7,stroke:#80CBC4,color:#333
style C fill:#B5EAD7,stroke:#80CBC4,color:#333
style D fill:#B5EAD7,stroke:#80CBC4,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#3337.4 推荐资源
| 资源 | 类型 | 适合 |
|---|---|---|
| C++ Primer | 入门 | 0 基础入门 |
| Effective C++ | 进阶 | 写代码 6 个月后 |
| Effective Modern C++ | 进阶 | 写代码 1 年后 |
| cppreference.com | 工具 | 查询语法 |
| godbolt.org | 工具 | 看汇编、调代码 |
| isocpp.org | 资源 | 标准、提案 |
| CppCon | 视频 | 前沿、实践 |
| C++ Core Guidelines | 规范 | 团队规范 |
八、回到 55 条款的”4 大哲学”
哲学 1:编译器是你的朋友
不要和编译器作对——相信它、依赖它、配合它。
- 条款 05:编译器生成 4 个函数 = 不要重复造轮子
- 条款 12:复制对象时勿忘成分 = 编译器警告会提醒你
- 条款 30:inline = 编译器决定是否 inline
- 条款 31:最小化编译依赖 = 编译器只编译你需要的
- 条款 53:不要忽视警告 = 编译器在”帮”你
哲学 2:RAII 是灵魂
C++ 资源管理的核心范式——构造获取,析构释放。
- 条款 13-17:5 个 RAII 条款
- 条款 25:noexcept swap
- 条款 29:异常安全 = RAII 的延伸
- 条款 52:placement new 配套 placement delete
哲学 3:const 是契约,类型是文档
C++ 的类型系统是”编译期验证”——让对的代码亮起来。
- 条款 03-04:const 正确性
- 条款 18:易用且难误用
- 条款 19:class = type
- 条款 22:private 成员
- 条款 24:对称操作符
- 条款 27:少做转型
- 条款 47:traits 表现类型信息
哲学 4:标准库是最好的老师
不重复造轮子——90% 的需求标准库已有。
- 条款 23:non-member、non-friend(STL 风格)
- 条款 32-40:继承的 3 种关系(标准库 + Boost)
- 条款 41-48:模板的力量(STL = 模板的范本)
- 条款 49-52:内存管理(标准库 + 自定义)
- 条款 54-55:熟悉标准库 + Boost
九、Effective C++ 9 大章节一图概览
graph TB
A["Effective C++ 55 条款"] --> B["1. 让自己习惯 C++\n4 条款"]
A --> C["2. 构造/析构/赋值\n8 条款"]
A --> D["3. 资源管理\n5 条款"]
A --> E["4. 设计与声明\n8 条款"]
A --> F["5. 实现\n6 条款"]
A --> G["6. 继承与 OOP\n9 条款"]
A --> H["7. 模板与泛型\n8 条款"]
A --> I["8. 定制 new/delete\n4 条款"]
A --> J["9. 杂项\n3 条款"]
B --> B1["C++ 联邦\nconst / enum / inline\nconst 正确性\n初始化"]
C --> C1["编译器生成的函数\n= delete\nvirtual 析构\n析构不抛\ncopy-and-swap"]
D --> D1["RAII\n拷贝语义\nget()\nnew/delete 匹配\n独立语句"]
E --> E1["易用且难误用\nclass = type\nconst ref 传参\n值返回\nprivate\nnon-member\n对称操作符\nswap"]
F --> F1["延后定义\n少做转型\n不返 handle\n异常安全\ninline\n最小编译依赖"]
G --> G1["is-a\nusing 声明\n虚函数语义\nNVI / 策略\n不重定义 non-virtual\n不重定义缺省\n复合 > 继承\nprivate 继承\n多重继承"]
H --> H1["隐式接口\ntypename\n模板继承\n代码膨胀\n成员函数模板\nfriend 模板\ntraits\nTMP"]
I --> I1["new-handler\n定制时机\n固守常规\nplacement"]
J --> J1["警告\n标准库\nBoost"]
style A fill:#FFB3C6,stroke:#F48FB1,stroke-width:3px,color:#333
style B fill:#C7CEEA,stroke:#9FA8DA,color:#333
style C fill:#E8D5F5,stroke:#CE93D8,color:#333
style D fill:#FFDAB9,stroke:#FFAB76,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#333
style F fill:#FFF9C4,stroke:#F9A825,color:#333
style G fill:#C7CEEA,stroke:#9FA8DA,color:#333
style H fill:#E8D5F5,stroke:#CE93D8,color:#333
style I fill:#FFDAB9,stroke:#FFAB76,color:#333
style J fill:#FFB3C6,stroke:#F48FB1,color:#333
style B1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style C1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style D1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style E1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style F1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style G1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style H1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style I1 fill:#B5EAD7,stroke:#80CBC4,color:#333
style J1 fill:#B5EAD7,stroke:#80CBC4,color:#333十、55 条款的”5 道终极题”
这 5 道题,如果你都能清晰回答,说明 Effective C++ 真的读懂了。
终极题 1:什么是 C++?
答案要点:
- 4 个子语言的联邦(C / OOP C++ / Template C++ / STL)
- 编译期多态 + 运行期多态
- 资源管理 + 异常安全
- 类型系统 + 模板元编程
- 兼容 C + 零开销抽象
终极题 2:什么是 RAII?
答案要点:
- Resource Acquisition Is Initialization
- 构造获取资源,析构释放资源
- 异常安全 + 自动清理
- 智能指针、lock_guard、fstream 都是 RAII
终极题 3:什么是 Rule of Three / Five / Zero?
答案要点:
- Rule of Three:析构 + 拷贝构造 + 拷贝赋值
- Rule of Five:+ 移动构造 + 移动赋值
- Rule of Zero:用标准库管资源(不自己写)
终极题 4:什么是 pimpl?
答案要点:
- Private Implementation
unique_ptr<Impl> pImpl_- 隐藏实现、加速编译、ABI 稳定
~T()必须在 .cpp 中实现
终极题 5:C++ 的”未来”是什么?
答案要点:
- C++17:filesystem、variant、optional、string_view
- C++20:concepts、modules、coroutines、ranges
- C++23:expected、mdspan、flat_map
- Boost 是 C++ 标准的”候选库”
十一、本篇速查表
| 主题 | 关键 API / 模式 | 适用场景 |
|---|---|---|
| 编译器警告 | -Wall -Werror | 跨平台开发 |
| 标准库 | std::vector / std::unique_ptr | 90% 场景 |
| Boost | boost::asio / boost::filesystem | 跨平台工具 |
| 性能优化 | RVO / 移动 / 模板 | 性能调优 |
| 内存安全 | 智能指针 / RAII | 异常安全 |
| API 设计 | const ref / private / non-member | 接口设计 |
| 现代 C++ | auto / if constexpr / concepts | C++11/17/20 |
| 编译优化 | pimpl / forward declaration | 编译时间 |
| 内存池 | 自定义 new/delete | 高频小对象 |
| 异常安全 | copy-and-swap | 强异常保证 |
十二、系列导航
| # | 文章 | 状态 |
|---|---|---|
| 0 | 系列总览 | ✅ 已发布 |
| 1 | 让自己习惯 C++ | ✅ 已发布 |
| 2 | 构造/析构/赋值 | ✅ 已发布 |
| 3 | 资源管理 | ✅ 已发布 |
| 4 | 设计与声明 | ✅ 已发布 |
| 5 | 实现 | ✅ 已发布 |
| 6 | 继承与 OOP | ✅ 已发布 |
| 7 | 模板与泛型 | ✅ 已发布 |
| 8 | 定制 new / delete | ✅ 已发布 |
| 9 | 本文:杂项 + 总结 | ✅ 已发布 |
十三、结尾金句
“C++ 是一门让你成为更好程序员(或者更糟)的语言。” —— Scott Meyers
“Effective C++ 的 55 个条款,是 C++ 程序员从”能用”到”用好”的必经之路。”
“不要害怕 C++ 的复杂性——理解它、驯服它、享受它。”
行动召唤
- 今天:检查你的代码——有”忽视 warning”的地方吗?开启
-Werror - 今天:列出你项目里所有”裸 new/delete”——准备改成智能指针
- 本周:阅读 1-2 个 Boost 库的源码——学习标准库之外的”高质量 C++”
- 本月:用 Effective C++ 的 9 大主题,code review 一次你的项目
- 持续:把 Effective C++ 的 4 大哲学融入你的日常编码
写在最后
Effective C++ 是一本改变你 C++ 编码习惯的书——从”我能写 C++”到”我会写 C++”。
9 篇博客、9 大主题、55 个条款、4 大哲学——这趟旅程我们一起走完了。
下一篇预告:将开启More Effective C++ 系列——35 个条款,深入 35 个”改善编程与设计”的有效方法。包括:基础议题、操作符、异常、效率、技术、杂项。
C++ 之难,难在哲学;C++ 之美,美在哲学。
让我们一起,做”懂哲学”的 C++ 程序员。
维护者:Xu Qi
最后更新:2026-06-18
许可:CC BY 4.0