graph TB
A["More Effective C++ 35 条款"] --> B["基础 (1-4)"]
A --> C["操作符 (5-8)"]
A --> D["异常 (9-15)"]
A --> E["效率 (16-24)"]
A --> F["技术 (25-31)"]
A --> G["杂项 (32-35)"]
G --> G1["未来时态\n(条款 32)"]
G --> G2["抽象类\n(条款 33)"]
G --> G3["C/C++ 混合\n(条款 34)"]
G --> G4["标准库迁移\n(条款 35)"]
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:#FFB3C6,stroke:#F48FB1,color:#333
style G1 fill:#FFF9C4,stroke:#F9A825,color:#333
style G2 fill:#FFF9C4,stroke:#F9A825,color:#333
style G3 fill:#FFF9C4,stroke:#F9A825,color:#333
style G4 fill:#FFF9C4,stroke:#F9A825,color:#333
graph LR
A["未来时态"] --> B["将每个 class 设计为 abstract\n(条款 33)"]
A --> C["使用 template\n泛型编程"]
A --> D["使用智能指针\nRAII"]
A --> E["使用标准库\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:#B5EAD7,stroke:#80CBC4,color:#333
style E fill:#FFF9C4,stroke:#F9A825,color:#333
1.3 原则 1:将每个 class 设计为 abstract
1 2 3 4 5 6 7 8 9 10 11
// ❌ 错:根 class 已经是"具体类" classShape { /*...*/ }; // 别人会直接用 Shape classCircle : public Shape { /*...*/ };
graph TB
A["标准 C++"] --> B["类型安全\ntype safety"]
A --> C["RAII 资源管理"]
A --> D["泛型编程\ntemplate"]
A --> E["STL 容器/算法"]
A --> F["异常安全"]
A --> G["命名空间"]
A --> H["智能指针"]
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
4.5 关键启示
标准 C++ = 用 std::* 替换手写
std::string 替代 char*——内存安全
std::vector 替代 C 数组——边界检查
unique_ptr 替代 auto_ptr——明确所有权
五、35 条款总结:6 大主题全景
5.1 6 大主题地图
graph TB
A["More Effective C++ 35 条款"] --> B["基础 (1-4)\n指针/转型/数组/默认构造"]
A --> C["操作符 (5-8)\n转换/前置后置/&&||/new"]
A --> D["异常 (9-15)\ndtor/ctor/抛/捕获/noexcept"]
A --> E["效率 (16-24)\n80-20/lazy/摊销/临时/RVO/重载"]
A --> F["技术 (25-31)\nclone/计数/heap/智能指针/引用计数/proxy/分派"]
A --> G["杂项 (32-35)\n未来时态/抽象/C 混合/标准库"]
B --> B1["条款 1-4"]
C --> C1["条款 5-8"]
D --> D1["条款 9-15"]
E --> E1["条款 16-24"]
F --> F1["条款 25-31"]
G --> G1["条款 32-35"]
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 B1 fill:#FFF9C4,stroke:#F9A825,color:#333
style C1 fill:#FFF9C4,stroke:#F9A825,color:#333
style D1 fill:#FFF9C4,stroke:#F9A825,color:#333
style E1 fill:#FFF9C4,stroke:#F9A825,color:#333
style F1 fill:#FFF9C4,stroke:#F9A825,color:#333
style G1 fill:#FFF9C4,stroke:#F9A825,color:#333
5.2 35 条款速查表
主题
条款
黄金法则
基础
1
指针/引用的选择
基础
2
C++ 转型的 4 种用途
基础
3
多态数组的”灾难”
基础
4
默认构造的”陷阱”
操作符
5
用户定义转换函数
操作符
6
前置/后置++/–的差异
操作符
7
&&/`
操作符
8
new/delete 的重载
异常
9
destructor 不抛
异常
10
constructor 防止泄漏
异常
11
析构不抛(续)
异常
12
抛异常 vs 传参
异常
13
catch by reference
异常
14
noexcept 与性能
异常
15
异常的成本
效率
16
80-20 法则
效率
17
lazy evaluation
效率
18
摊销成本
效率
19
临时对象的”陷阱”
效率
20
返回值优化 (RVO)
效率
21
重载避免隐式转换
效率
22
op= 优于 op
效率
23
考虑使用其他程序库
效率
24
虚函数 / 多重继承 / RTTI 的成本
技术
25
虚拟构造(clone)
技术
26
限制对象数量
技术
27
heap 中创建对象
技术
28
智能指针
技术
29
引用计数
技术
30
proxy class
技术
31
双重分派
杂项
32
未来时态
杂项
33
非尾端类 = abstract
杂项
34
C/C++ 混合编程
杂项
35
习惯标准 C++
5.3 4 大核心范式回顾
graph TB
A["More Effective C++ 的 4 大范式"] --> B["类型安全\ntype safety"]
A --> C["RAII 资源管理"]
A --> D["异常安全\nexception safety"]
A --> E["泛型编程\ngeneric programming"]
B --> B1["const-correctness\n强类型 enum\n避免转型"]
C --> C1["智能指针\nauto_ptr→unique_ptr\n引用计数 shared_ptr"]
D --> D1["noexcept\nexception-safe\ndestructor 不抛"]
E --> E1["template\nstd::variant\nstd::visit"]
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 B1 fill:#FFF9C4,stroke:#F9A825,color:#333
style C1 fill:#FFF9C4,stroke:#F9A825,color:#333
style D1 fill:#FFF9C4,stroke:#F9A825,color:#333
style E1 fill:#FFF9C4,stroke:#F9A825,color:#333
graph TB
A["More Effective C++ 35 条款"] --> B["仍然有效\n(核心思想)"]
A --> C["部分过时\n(API 已变化)"]
A --> D["C++11/14/17/20 替代方案"]
B --> B1["未来时态\n异常安全\n虚函数成本\nRAII"]
C --> C1["auto_ptr\n异常规范 throw()"]
D --> D1["unique_ptr\nnoexcept\nstd::variant\nstd::visit\nstd::span"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#B5EAD7,stroke:#80CBC4,color:#333
style C fill:#FFB3C6,stroke:#F48FB1,color:#333
style D fill:#E8D5F5,stroke:#CE93D8,color:#333
style B1 fill:#FFF9C4,stroke:#F9A825,color:#333
style C1 fill:#FFF9C4,stroke:#F9A825,color:#333
style D1 fill:#FFF9C4,stroke:#F9A825,color:#333
graph TB
A["More Effective C++ 35 条款"] --> B["基础\n(1-4)"]
A --> C["操作符\n(5-8)"]
A --> D["异常\n(9-15)"]
A --> E["效率\n(16-24)"]
A --> F["技术\n(25-31)"]
A --> G["杂项\n(32-35)"]
B --> B0["第 1 篇"]
C --> C0["第 2 篇"]
D --> D0["第 3-4 篇"]
E --> E0["第 5-6 篇"]
F --> F0["第 7 篇"]
G --> G0["第 8 篇"]
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 B0 fill:#FFF9C4,stroke:#F9A825,color:#333
style C0 fill:#FFF9C4,stroke:#F9A825,color:#333
style D0 fill:#FFF9C4,stroke:#F9A825,color:#333
style E0 fill:#FFF9C4,stroke:#F9A825,color:#333
style F0 fill:#FFF9C4,stroke:#F9A825,color:#333
style G0 fill:#FFF9C4,stroke:#F9A825,color:#333