The C++ Programming Language (Fourth Edition)
C++ 之父 Bjarne Stroustrup 的权威巨著,C++ 语言的”圣经”。第四版全面覆盖 C++11 标准,1366 页,4 大部分 44 章,从基础语法到抽象机制再到标准库,是 C++ 程序员的终极参考。
核心定位
- 作者:Bjarne Stroustrup —— C++ 语言的发明者
- 标准:基于 C++11(ISO/IEC 14882-2011)
- 目标读者:专业程序员,而非初学者
- 写作理念:每个特性都提供 Rationale(设计原理)+ Specification(精确定义)+ Examples(使用范例)
- 核心主张:C++11 让 C++ “感觉像一门新语言”——表达更清晰、更简洁、更直接,编译检查更完善,运行更快
C++ 设计哲学
语言本质
- C++ 是通用编程语言,强调类型丰富(type-rich)、轻量级抽象的设计与使用
- 特别适合资源受限的应用(如软件基础设施)
- C++ 奖励那些花时间掌握高质量代码编写技术的程序员
- “C++ 是为认真对待编程的人设计的语言”——Stroustrup
关键设计原则
- 你不用的东西,你不必为之付出代价(Zero-overhead principle)
- 与 C 的兼容性——但不是盲目兼容,而是在合理范围内
- 静态类型系统——尽可能在编译期发现错误
- 多范式支持——过程式、面向对象、泛型、函数式,程序员自由选择
- 标准库是一等公民——语言特性与标准库协同设计
C++11 的革命性变化
相比 C++98,C++11 的改进是根本性的:
- 并发内存模型——适应现代多核计算机
- 统一初始化语法(uniform initialization)
- 移动语义(move semantics)——效率革命
- Lambda 表达式
- auto 类型推导
- constexpr 编译期计算
- 可变参数模板(variadic templates)
- 用户定义字面量(user-defined literals)
- 范围 for 循环(range-based for)
- 标准库大扩容:线程/任务、正则表达式、智能指针、随机数、哈希容器……
“所有计算机科学问题都可以通过增加一层间接来解决,除了’间接层太多’这个问题。” —— David J. Wheeler(书的题词)
全书结构
Part I: Introductory Material(第 1-5 章,第 3-130 页)
入门导览——快速建立现代 C++ 全景视野
| 章 | 主题 | 核心内容 |
|---|---|---|
| 1 | Notes to the Reader | 本书结构、C++ 设计哲学、编程风格、学习建议、历史背景 |
| 2 | A Tour of C++: The Basics | 基础语法速览:类型、变量、表达式、语句、函数 |
| 3 | A Tour of C++: Abstraction Mechanisms | 类、继承、模板、异常——C++ 抽象的三大支柱 |
| 4 | A Tour of C++: Containers and Algorithms | STL 概览:vector、map、算法、迭代器 |
| 5 | A Tour of C++: Concurrency and Utilities | 并发基础、线程、任务、实用工具库 |
设计意图:前 5 章是”闪电 tour”,让有经验的程序员快速了解现代 C++ 的全貌,然后再深入细节。这是 Stroustrup 推荐的学习路径——先整体后局部。
Part II: Basic Facilities(第 6-15 章,第 133-445 页)
基础机制——C++ 的底层积木
| 章 | 主题 | 核心内容 |
|---|---|---|
| 6 | Types and Declarations | 类型系统、声明语法、基本类型、常量、类型别名、decltype |
| 7 | Pointers, Arrays, and References | 指针、数组、引用、指针算术、数组到指针的退化 |
| 8 | Structures, Unions, and Enumerations | struct、union、enum、enum class(强类型枚举) |
| 9 | Statements | 分支、循环、switch、goto、异常的语句级影响 |
| 10 | Expressions | 运算符优先级、类型转换、左值/右值、求值顺序 |
| 11 | Select Operations | 条件运算符、位运算、sizeof、alignof、typeid |
| 12 | Functions | 函数定义、参数传递、返回值、递归、inline、constexpr 函数 |
| 13 | Exception Handling | try/catch、throw、异常安全保证、RAII 与异常的协同 |
| 14 | Namespaces | 命名空间、using 声明/指令、命名空间别名、ADL |
| 15 | Source Files and Programs | 编译模型、头文件、链接、单头 vs 多头组织、程序物理结构 |
Part II 核心要点:
- C++ 的类型系统是其最强大的武器——用类型表达设计意图
- RAII(资源获取即初始化)是 C++ 资源管理的基石,与异常处理深度绑定
- 命名空间是管理大规模代码的关键工具——单头文件组织适合小项目,多头文件组织适合大项目
- 编译模型:头文件声明 + .cpp 定义 + 链接器组合,是理解 C++ 物理结构的基础
Part III: Abstraction Mechanisms(第 16-29 章,第 447-855 页)
抽象机制——C++ 最核心的竞争力所在
这是全书最重要、最有深度的部分。Stroustrup 认为 C++ 的本质是**用户定义类型(类)和泛型编程(模板)**的结合。
面向对象部分(第 16-21 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 16 | Classes | 类的基本概念、成员函数、访问控制(public/private/protected)、const 成员、静态成员 |
| 17 | Construction, Cleanup, Copy, and Move | 构造函数、析构函数、拷贝构造/赋值、移动构造/赋值(C++11 核心)、=default/=delete |
| 18 | Overloading | 函数重载、运算符重载、重载解析规则、用户定义转换 |
| 19 | Special Operators | operator=、operator[]、operator()、operator->、operator++ 等特殊运算符 |
| 20 | Derived Classes | 继承、虚函数、多态、虚析构函数、覆盖(override) |
| 21 | Class Hierarchies | 类层次设计、多重继承、虚继承、抽象类、接口与实现的分离 |
| 22 | Run-Time Type Information | dynamic_cast、typeid、RTTI 的合理使用与滥用 |
模板与泛型编程部分(第 23-29 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 23 | Templates | 模板基础、类模板、函数模板、模板参数、typename 与 class |
| 24 | Generic Programming | 泛型编程思想、概念(Concepts)的设计理念、迭代器类别 |
| 25 | Specialization | 模板特化、偏特化、特化优先级、SFINAE 原理 |
| 26 | Instantiation | 模板实例化、显式实例化、实例化模型、编译期计算 |
| 27 | Templates and Hierarchies | 模板与继承的结合、CRTP、类型擦除 |
| 28 | Metaprogramming | 模板元编程、类型 traits、编译期计算、Enable_if、类型计算 |
| 29 | A Matrix Design | 综合案例:用模板设计一个 N 维矩阵库,展示泛型编程的威力 |
Part III 核心洞察:
- 类 = 接口 + 实现的封装:类的核心价值不是语法糖,而是让用户定义类型可以像内置类型一样使用(value semantics)
- 构造/析构/拷贝/移动 四大特殊函数控制对象的生命周期——这是 RAII 的技术基础
- 移动语义(C++11):从根本上改变了 C++ 的性能模型——临时对象不再需要昂贵的拷贝
- 模板不是宏:模板是类型安全的编译期机制,实例化时进行完整的类型检查
- 泛型编程 vs OOP:
- OOP 通过运行时多态(虚函数)处理”一组相关类型”
- 泛型编程通过编译时多态(模板)处理”满足同一概念的任意类型”
- 两者不是竞争关系,而是互补
- 模板元编程:把类型当作数据,在编译期进行计算——Enable_if、type traits、类型列表是核心工具
- 第 29 章 Matrix 案例:全书最精彩的实战案例,展示如何用模板、特化、元编程技术设计一个优雅高效的 N 维数值矩阵库
Part IV: The Standard Library(第 30-44 章,第 857-1279 页)
标准库——现代 C++ 程序员的工具箱
标准库不是”附加品”,而是 C++ 的有机组成部分。Stroustrup 在讲解语言特性时始终与标准库结合。
STL 核心(第 31-33 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 30 | Standard Library Summary | 标准库全景概览,全部头文件分类索引 |
| 31 | STL Containers | vector、string、deque、list、forward_list、map、set、unordered_*、array、stack、queue |
| 32 | STL Algorithms | 遍历、排序、查找、变换、数值算法等 70+ 标准算法 |
| 33 | STL Iterators | 迭代器类别(输入/输出/前向/双向/随机访问)、迭代器适配器、流迭代器 |
内存与工具(第 34-36 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 34 | Memory and Resources | 智能指针(unique_ptr、shared_ptr、weak_ptr)、分配器(allocator)、资源管理 |
| 35 | Utilities | pair、tuple、optional、variant(C++17 前瞻)、any、时间库、类型 traits |
| 36 | Strings | std::string、字符串操作、字符串转换、basic_string 模板 |
I/O 与文本(第 37-39 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 37 | Regular Expressions | 正则表达式库(C++11 新增)、regex、smatch、ECMAScript 语法 |
| 38 | I/O Streams | 流 I/O 体系、iostream、fstream、stringstream、格式化、操纵符(manipulator) |
| 39 | Locales | 本地化、字符编码、数字/日期/货币格式化、facet 机制 |
数值与并发(第 40-42 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 40 | Numerics | 复数、valarray、数值算法(accumulate、inner_product 等)、随机数库 |
| 41 | Concurrency | 并发模型、内存模型、原子操作、mutex、条件变量、future/promise |
| 42 | Threads and Tasks | 线程与任务、std::thread、std::async、packaged_task、线程安全设计 |
兼容与底层(第 43-44 章)
| 章 | 主题 | 核心内容 |
|---|---|---|
| 43 | The C Standard Library | C 标准库的 C++ 封装、cstdio、cstdlib、cstring、ctime 等 |
| 44 | Compatibility | 与 C 的兼容性、C/C++ 混合编程、旧代码迁移、链接兼容 |
核心概念深度解析
1. RAII(Resource Acquisition Is Initialization)
C++ 最重要的编程范式,没有之一。
- 核心思想:将资源的生命周期与对象的生命周期绑定
- 技术手段:构造函数获取资源,析构函数释放资源
- 应用范围:内存、文件句柄、互斥锁、网络连接……所有需要手动管理的资源
- 与异常的协同:即使发生异常,栈展开时局部对象的析构函数也一定会被调用——保证资源不泄漏
- 标准库范例:
unique_ptr、shared_ptr、lock_guard、ifstream、vector
2. 移动语义(Move Semantics)
C++11 最重要的效率改进。
- 问题:临时对象的深拷贝是不必要的浪费
- 方案:通过右值引用(
T&&)让对象”窃取”临时对象的资源 - 核心函数:移动构造函数
T(T&&)和移动赋值运算符T& operator=(T&&) - 价值:让”按值返回”和”按值传参”变得高效——改变了 C++ 的编程风格
std::move:不是移动,而是强制转换为右值引用,告诉编译器”这个对象可以被移动”
3. 智能指针
C++ 内存管理的现代化方案。
| 指针类型 | 所有权 | 拷贝代价 | 适用场景 |
|---|---|---|---|
unique_ptr<T> | 独占所有权 | 不可拷贝,只能移动 | 大多数场景,默认选择 |
shared_ptr<T> | 共享所有权(引用计数) | 原子操作开销 | 多所有者、生命周期不确定 |
weak_ptr<T> | 观察所有权 | - | 打破 shared_ptr 循环引用、缓存 |
4. 模板与泛型编程
C++ 区别于其他语言的核心竞争力。
- 编译期多态:模板在编译时实例化,零运行时开销
- Concepts(概念):对模板参数的约束——C++20 正式加入,C++11 时代用 Enable_if/type traits 模拟
- SFINAE(Substitution Failure Is Not An Error):模板替换失败不是错误——Enable_if 的原理基础
- 模板元编程:把类型当作数据,在编译期进行计算和决策
- Policy-Based Design:通过模板参数组合策略,在编译期组装行为
5. 并发模型
C++11 首次定义了正式的内存模型和线程库。
- 线程:
std::thread——底层线程原语 - 任务:
std::async+std::future——更高层的抽象 - 同步:
mutex、condition_variable、lock_guard、unique_lock - 原子操作:
std::atomic——无锁编程基础 - 内存模型:定义了多线程环境下的内存可见性和执行顺序规则
Stroustrup 的编程建议
关于学习 C++
“本书的目标是帮助读者理解 C++ 提供的机制如何支持关键的编程技术。目标是带领读者远远超越’靠复制示例和模仿其他编程风格让代码跑起来’的阶段。”
- 不要把 C++ 当 C 用——那样你会错过 C++ 最有价值的部分
- 不要把 C++ 当 Java 用——C++ 的抽象是零开销的,不需要”设计模式”来弥补语言缺陷
- 先学现代 C++(C++11 及以后),再了解旧特性;而不是反过来
- 标准库优先——能用标准库解决的就不要自己写
关于设计
- 类的设计目标:让用户定义类型用起来和内置类型一样自然(value semantics)
- 接口优先于实现——好的接口是最小完备的
- 错误处理:优先使用编译期检查(类型系统、static_assert),其次使用异常,最后才是返回码
- 性能:先保证正确,再测量,再优化——但要时刻意识到抽象的成本
关于代码质量
“编程就是理解。” —— Kristen Nygaard(第三版序言题词)
- 代码首先是写给人看的,顺便给机器执行
- 清晰的结构 > 巧妙的技巧
- 一致性和可预测性是可维护性的基石
与其他 C++ 书籍的关系
| 书籍 | 定位 | 与本书的关系 |
|---|---|---|
| 《A Tour of C++》-第二版-Bjarne-Stroustrup | 精简导览 | A Tour 是本书前 5 章的扩展版,适合入门快速了解 |
| 《Modern C++ Design》-现代C++设计-Andrei-Alexandrescu | 泛型设计进阶 | 本书第 28 章(元编程)的进阶读物,Policy-Based Design 奠基作 |
| 《C++ Concurrency in Action》-第二版-Anthony-Williams | 并发专题 | 本书第 41-42 章(并发)的深度扩展,更全面更实用 |
| Programming: Principles and Practice Using C++ | 入门教材 | Stroustrup 为初学者写的入门书,本书是进阶读物 |
| Effective C++ / More Effective C++ | 条款式指南 | 本书是系统性的参考,Effective 系列是经验法则补充 |
| The C++ Standard (ISO 标准) | 权威规范 | 本书是标准的”专家解读”,语言律师可以追溯到标准原文 |
关键数据
- 页数:1366 页
- 章节数:44 章 + 索引
- 部分数:4 大部分(入门 / 基础 / 抽象机制 / 标准库)
- 语言版本:C++11(ISO/IEC 14882-2011)
- 首次出版:2013 年
- 出版社:Addison-Wesley
- 作者:Bjarne Stroustrup(C++ 发明者,图灵奖得主 2018)
阅读建议
- 有经验的程序员:先读第 2-5 章(Tour)建立全景 → 按需查阅 Part II-IV
- C++ 程序员升级 C++11:重点读第 17 章(移动语义)、第 23-28 章(现代模板)、第 34 章(智能指针)、第 41-42 章(并发)
- C 程序员转学 C++:从 Part II 开始,特别关注第 8 章(类的前身 struct)、第 16 章(类)、第 34 章(告别手动内存管理)
- 系统学习:按顺序读完 Part II → Part III → Part IV,每章做笔记和练习
- 案头参考:Part IV(标准库)和索引是日常工作中最常查阅的部分