【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
2
3
4
5
6
7
8
9
10
11
12
13
class Base {
public:
virtual void f() const;
};

class Derived : public Base {
public:
virtual void f(); // ❌ 缺 const
};

void process(const Base& b) {
b.f(); // 调用 Base::f(const),不是 Derived::f(非 const)
}

编译器的 warning

1
warning: 'Derived::f' hides virtual 'Base::f' [-Woverloaded-virtual]

1.2 警告 vs 错误

类型含义行动
error编译失败必须修
warning编译通过,但”可能有问题”应该

反直觉

  • 警告是”未来版本的错误”——升级编译器就报错
  • 警告是”跨平台的错误”——某些平台/编译器/版本会失败
  • 警告是”优化的线索”——编译器比你更懂

1.3 实战原则

1
2
3
4
5
6
7
8
9
// 1. 最高警告等级
g++ -Wall -Wextra -Wpedantic

// 2. 把 warning 当 error
g++ -Wall -Wextra -Wpedantic -Werror

// 3. 跨编译器测试
clang++ -Wall -Wextra -Wpedantic
MSVC /W4

1.4 “不沉默”的最高境界

1
2
3
4
5
6
7
8
9
10
11
12
13
// ❌ 沉默的 bug
class Widget {
int data_;
Widget(const Widget& w) : data_(w.data_) {} // 漏了其他成员
};

// ✅ 警告是"指针"
class Widget {
int data_;
std::string name_;
Widget(const Widget& w) : data_(w.data_), name_(w.name_) {} // 完整
};
// -Wuninitialized 可能会警告

1.5 关键启示

  1. warning 是”编译器想告诉你的事”——不要忽视
  2. 开发期 -Werror——把 warning 当 error
  3. 跨编译器测试——不同编译器找不同问题
  4. CI 加 ASan / UBSan / TSan——找运行期问题

二、条款 54:让自己熟悉包括 TR1 在内的标准程序库

2.1 C++ 标准库的全景(C++11 之后)

类别包含
容器vectorlistdequemapsetunordered_maparrayforward_list
算法sortfindtransformaccumulate
迭代器iteratorreverse_iteratormove_iterator
函数对象functionbindfunctionhash
智能指针unique_ptrshared_ptrweak_ptr
正则regex
随机数randomdefault_random_engine
时间chrono::durationchrono::time_point
并发threadmutexcondition_variableatomic
文件系统(C++17)filesystem::pathdirectory_iterator
可选类型(C++17)optionalvariantany
协程(C++20)co_awaitco_yield
模块(C++20)import / export

2.2 “自己造轮子”的反例

1
2
3
4
5
6
// ❌ 自己写 unique_ptr
template<typename T>
class MyUniquePtr { /* 100 行 */ };

// ✅ 用 std::unique_ptr
std::unique_ptr<Widget> p = std::make_unique<Widget>();

优势

  • 标准库经过亿级项目验证
  • 编译器深度优化标准库
  • 代码可读性更高
  • 跨平台一致

2.3 何时”自己造”?

  • 标准库没有(如 GPU 内存管理)
  • 标准库太慢(需要 profile 证实)
  • 标准库语义不对(如自定义内存池)

2.4 关键启示

  1. 先看标准库——90% 已有
  2. 不会用?查 cppreference.com
  3. C++11/14/17/20 加了很多好用的库
  4. “不重复造轮子”是金科玉律

三、条款 55:让自己熟悉 Boost

3.1 什么是 Boost?

Boost = 准标准 C++ 库——很多 Boost 库最终被纳入 C++ 标准(如 shared_ptrfunctionunordered_map 都来自 Boost)。

3.2 Boost 库的 3 大类

类别例子
C++ 标准的”预演”shared_ptrfunctionregex
跨平台的”工具”filesystemthreadasio(网络)
前沿研究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
2
3
4
5
6
7
8
9
10
11
12
13
#include <boost/asio.hpp>
using boost::asio::ip::tcp;

int main() {
boost::asio::io_context io;
tcp::acceptor acceptor(io, tcp::endpoint(tcp::v4(), 8080));

while (true) {
tcp::socket socket(io);
acceptor.accept(socket);
// 处理 socket
}
}

3.5 关键启示

  1. Boost = C++ 标准的”候选库”——质量高
  2. Boost.Asio 是网络编程的事实标准
  3. 学习 Boost = 学习 C++ 的前沿
  4. 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:#333

4.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:#333

4.4 55 条款一览表

条款主题关键词
01C++ 是语言联邦4 个子语言
02const/enum/inline 替代 #define编译器视角
03尽可能使用 constconst 正确性
04对象使用前先初始化构造顺序
05编译器默默生成的函数4 个函数
06拒绝编译器自动生成的函数= delete
07多态基类声明 virtual 析构多态删除
08别让异常逃离析构noexcept
09构造/析构中勿调 virtualvptr 时机
10operator= 返回 *this链式赋值
11operator= 处理自我赋值copy-and-swap
12复制对象勿忘每个成分拷贝完整
13以对象管理资源RAII
14资源管理类的 copying拷贝语义
15提供对原始资源的访问get()
16new/delete 形式匹配数组 vs 标量
17独立语句 new 出智能指针异常安全
18接口易用且难误用类型系统
19class 犹如 type11 问
20pass-by-const-ref 替代 value性能
21返回对象时别返回 refRVO
22成员变量声明为 private封装
23non-member、non-friend工具函数
24类型转换时用 non-member对称操作符
25noexcept swapcopy-and-swap
26延后变量定义避免白构造
27少做转型4 种 cast
28避免返回 handles内部成分
29异常安全3 个保证
30了解 inline隐式 inline
31最小化编译依赖pimpl
32public 继承塑模 is-aLiskov
33避免遮蔽继承的名字using
34接口继承与实现继承3 种虚函数
35virtual 以外的选择NVI / 策略
36绝不重定义 non-virtual静态绑定
37绝不重定义缺省参数静态绑定
38复合塑模 has-a / is-impl优先复合
39审慎使用 private 继承3 个场景
40审慎使用多重继承多接口
41隐式接口与编译期多态模板多态
42typename 的双重含义嵌套类型
43模板化基类的名称this-> / using
44抽离与参数无关的代码模板膨胀
45成员函数模板接受兼容类型智能指针
46类型转换时模板用 friendoperator
47traits classes 表现类型信息编译期查询
48认识 template 元编程编译期计算
49了解 new-handler失败回调
50new/delete 替换时机6 个理由
51new/delete 固守常规8 条铁律
52placement new 配套 delete异常安全
53不要轻视编译警告跨平台
54熟悉标准库不造轮子
55熟悉 BoostC++ 未来

五、C++ 工程实战:4 大主题

5.1 主题 1:性能优化

优化点条款关键点
传值 → 传 const ref20默认参数传递
拷贝 → 移动25, 41RVO + 移动构造
虚函数 → 模板35, 41编译期多态
模板膨胀44抽基类共享
内存池50, 51自定义 new/delete
内联30小函数 / 模板

5.2 主题 2:内存安全

安全点条款关键点
拒绝拷贝06= delete
资源管理13-17智能指针
异常安全29copy-and-swap
析构不抛08noexcept
placement delete52配套使用
内存池50, 51减少碎片

5.3 主题 3:API 设计

设计点条款关键点
易用且难误用18强类型
接口易扩展19, 22-23private + non-member
编译稳定31pimpl + 前向声明
性能承诺25, 29noexcept + 强异常保证
模板友好41-48traits + 隐式接口

5.4 主题 4:现代 C++

现代化条款关键点
= default / = delete05, 06C++11
智能指针13-17C++11
移动语义25, 29, RVOC++11
auto41-48C++11
if constexpr47-48C++17
concepts41-48C++20
modules31C++20
std::span / std::format18C++20

六、面试宝典

6.1 顶级 C++ 面试题(55 条款浓缩)

基础(5 题)

  1. C++ 是什么?——“语言联邦”:C / OOP C++ / Template C++ / STL
  2. 为什么 const 重要?——契约、文档、编译器优化
  3. 什么是 RAII?——Resource Acquisition Is Initialization
  4. 智能指针有哪些?——unique_ptr / shared_ptr / weak_ptr

进阶(10 题)

  1. Rule of Three——析构 + 拷贝构造 + 拷贝赋值 三者要么都不写,要么都写
  2. Rule of Five——C++11 起:+ 移动构造 + 移动赋值
  3. Rule of Zero——用标准库管资源,自己不写
  4. 多态基类为什么 virtual 析构?——delete base_ptr 才正确
  5. 什么是 pimpl?——unique_ptr<Impl> 隐藏实现
  6. operator= 怎么处理自我赋值?——copy-and-swap
  7. pass-by-value vs pass-by-const-ref?——默认 const&,内置类型/迭代器传值
  8. 什么时候用 private 继承?——protected 访问 / 虚函数重写 / EBO
  9. 什么是 copy-and-swap?——T& operator=(T rhs) { swap(rhs); return *this; }
  10. NVI 模式?——public non-virtual 包 private virtual

高阶(10 题)

  1. Liskov 替换原则?——派生类必须能完全替代基类
  2. public 继承 vs 复合?——is-a 用继承;has-a/is-impl 用复合
  3. 菱形继承怎么处理?——虚继承
  4. 虚函数的缺省参数为什么不能重写?——静态绑定
  5. 为什么模板不支持隐式转换?——参数推导时不做;用 friend 模板
  6. 什么是 traits?——编译期类型查询
  7. 什么是 TMP?——Template Meta-Programming;C++17+ 用 if constexpr
  8. placement new 配套什么?——placement delete
  9. operator new 失败时调什么?——new-handler
  10. C++20 concepts 是什么?——模板约束的”声明式”语法

6.2 实战题(5 题)

  1. 实现一个 unique_ptr(核心:移动构造 + = delete 拷贝)
  2. 实现一个 shared_ptr(核心:引用计数 + 循环引用)
  3. 实现 pimpl 模式(核心:前向声明 + 移动语义)
  4. 实现一个简单的 traits(核心:模板特化)
  5. 实现一个异常安全的 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:#333

7.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:#333

7.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:#333

7.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_ptr90% 场景
Boostboost::asio / boost::filesystem跨平台工具
性能优化RVO / 移动 / 模板性能调优
内存安全智能指针 / RAII异常安全
API 设计const ref / private / non-member接口设计
现代 C++auto / if constexpr / conceptsC++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++ 的复杂性——理解它、驯服它、享受它。”


行动召唤

  1. 今天:检查你的代码——有”忽视 warning”的地方吗?开启 -Werror
  2. 今天:列出你项目里所有”裸 new/delete”——准备改成智能指针
  3. 本周:阅读 1-2 个 Boost 库的源码——学习标准库之外的”高质量 C++”
  4. 本月:用 Effective C++ 的 9 大主题,code review 一次你的项目
  5. 持续:把 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