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

关键设计原则

  1. 你不用的东西,你不必为之付出代价(Zero-overhead principle)
  2. 与 C 的兼容性——但不是盲目兼容,而是在合理范围内
  3. 静态类型系统——尽可能在编译期发现错误
  4. 多范式支持——过程式、面向对象、泛型、函数式,程序员自由选择
  5. 标准库是一等公民——语言特性与标准库协同设计

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++ 全景视野

章主题核心内容
1Notes to the Reader本书结构、C++ 设计哲学、编程风格、学习建议、历史背景
2A Tour of C++: The Basics基础语法速览:类型、变量、表达式、语句、函数
3A Tour of C++: Abstraction Mechanisms类、继承、模板、异常——C++ 抽象的三大支柱
4A Tour of C++: Containers and AlgorithmsSTL 概览:vector、map、算法、迭代器
5A Tour of C++: Concurrency and Utilities并发基础、线程、任务、实用工具库

设计意图:前 5 章是”闪电 tour”,让有经验的程序员快速了解现代 C++ 的全貌,然后再深入细节。这是 Stroustrup 推荐的学习路径——先整体后局部。

Part II: Basic Facilities(第 6-15 章,第 133-445 页)

基础机制——C++ 的底层积木

章主题核心内容
6Types and Declarations类型系统、声明语法、基本类型、常量、类型别名、decltype
7Pointers, Arrays, and References指针、数组、引用、指针算术、数组到指针的退化
8Structures, Unions, and Enumerationsstruct、union、enum、enum class(强类型枚举)
9Statements分支、循环、switch、goto、异常的语句级影响
10Expressions运算符优先级、类型转换、左值/右值、求值顺序
11Select Operations条件运算符、位运算、sizeof、alignof、typeid
12Functions函数定义、参数传递、返回值、递归、inline、constexpr 函数
13Exception Handlingtry/catch、throw、异常安全保证、RAII 与异常的协同
14Namespaces命名空间、using 声明/指令、命名空间别名、ADL
15Source Files and Programs编译模型、头文件、链接、单头 vs 多头组织、程序物理结构

Part II 核心要点:

  • C++ 的类型系统是其最强大的武器——用类型表达设计意图
  • RAII(资源获取即初始化)是 C++ 资源管理的基石,与异常处理深度绑定
  • 命名空间是管理大规模代码的关键工具——单头文件组织适合小项目,多头文件组织适合大项目
  • 编译模型:头文件声明 + .cpp 定义 + 链接器组合,是理解 C++ 物理结构的基础

Part III: Abstraction Mechanisms(第 16-29 章,第 447-855 页)

抽象机制——C++ 最核心的竞争力所在

这是全书最重要、最有深度的部分。Stroustrup 认为 C++ 的本质是**用户定义类型(类)和泛型编程(模板)**的结合。

面向对象部分(第 16-21 章)

章主题核心内容
16Classes类的基本概念、成员函数、访问控制(public/private/protected)、const 成员、静态成员
17Construction, Cleanup, Copy, and Move构造函数、析构函数、拷贝构造/赋值、移动构造/赋值(C++11 核心)、=default/=delete
18Overloading函数重载、运算符重载、重载解析规则、用户定义转换
19Special Operatorsoperator=、operator[]、operator()、operator->、operator++ 等特殊运算符
20Derived Classes继承、虚函数、多态、虚析构函数、覆盖(override)
21Class Hierarchies类层次设计、多重继承、虚继承、抽象类、接口与实现的分离
22Run-Time Type Informationdynamic_cast、typeid、RTTI 的合理使用与滥用

模板与泛型编程部分(第 23-29 章)

章主题核心内容
23Templates模板基础、类模板、函数模板、模板参数、typename 与 class
24Generic Programming泛型编程思想、概念(Concepts)的设计理念、迭代器类别
25Specialization模板特化、偏特化、特化优先级、SFINAE 原理
26Instantiation模板实例化、显式实例化、实例化模型、编译期计算
27Templates and Hierarchies模板与继承的结合、CRTP、类型擦除
28Metaprogramming模板元编程、类型 traits、编译期计算、Enable_if、类型计算
29A Matrix Design综合案例:用模板设计一个 N 维矩阵库,展示泛型编程的威力

Part III 核心洞察:

  1. 类 = 接口 + 实现的封装:类的核心价值不是语法糖,而是让用户定义类型可以像内置类型一样使用(value semantics)
  2. 构造/析构/拷贝/移动 四大特殊函数控制对象的生命周期——这是 RAII 的技术基础
  3. 移动语义(C++11):从根本上改变了 C++ 的性能模型——临时对象不再需要昂贵的拷贝
  4. 模板不是宏:模板是类型安全的编译期机制,实例化时进行完整的类型检查
  5. 泛型编程 vs OOP:
    • OOP 通过运行时多态(虚函数)处理”一组相关类型”
    • 泛型编程通过编译时多态(模板)处理”满足同一概念的任意类型”
    • 两者不是竞争关系,而是互补
  6. 模板元编程:把类型当作数据,在编译期进行计算——Enable_if、type traits、类型列表是核心工具
  7. 第 29 章 Matrix 案例:全书最精彩的实战案例,展示如何用模板、特化、元编程技术设计一个优雅高效的 N 维数值矩阵库

Part IV: The Standard Library(第 30-44 章,第 857-1279 页)

标准库——现代 C++ 程序员的工具箱

标准库不是”附加品”,而是 C++ 的有机组成部分。Stroustrup 在讲解语言特性时始终与标准库结合。

STL 核心(第 31-33 章)

章主题核心内容
30Standard Library Summary标准库全景概览,全部头文件分类索引
31STL Containersvector、string、deque、list、forward_list、map、set、unordered_*、array、stack、queue
32STL Algorithms遍历、排序、查找、变换、数值算法等 70+ 标准算法
33STL Iterators迭代器类别(输入/输出/前向/双向/随机访问)、迭代器适配器、流迭代器

内存与工具(第 34-36 章)

章主题核心内容
34Memory and Resources智能指针(unique_ptr、shared_ptr、weak_ptr)、分配器(allocator)、资源管理
35Utilitiespair、tuple、optional、variant(C++17 前瞻)、any、时间库、类型 traits
36Stringsstd::string、字符串操作、字符串转换、basic_string 模板

I/O 与文本(第 37-39 章)

章主题核心内容
37Regular Expressions正则表达式库(C++11 新增)、regex、smatch、ECMAScript 语法
38I/O Streams流 I/O 体系、iostream、fstream、stringstream、格式化、操纵符(manipulator)
39Locales本地化、字符编码、数字/日期/货币格式化、facet 机制

数值与并发(第 40-42 章)

章主题核心内容
40Numerics复数、valarray、数值算法(accumulate、inner_product 等)、随机数库
41Concurrency并发模型、内存模型、原子操作、mutex、条件变量、future/promise
42Threads and Tasks线程与任务、std::thread、std::async、packaged_task、线程安全设计

兼容与底层(第 43-44 章)

章主题核心内容
43The C Standard LibraryC 标准库的 C++ 封装、cstdio、cstdlib、cstring、ctime 等
44Compatibility与 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)

阅读建议

  1. 有经验的程序员:先读第 2-5 章(Tour)建立全景 → 按需查阅 Part II-IV
  2. C++ 程序员升级 C++11:重点读第 17 章(移动语义)、第 23-28 章(现代模板)、第 34 章(智能指针)、第 41-42 章(并发)
  3. C 程序员转学 C++:从 Part II 开始,特别关注第 8 章(类的前身 struct)、第 16 章(类)、第 34 章(告别手动内存管理)
  4. 系统学习:按顺序读完 Part II → Part III → Part IV,每章做笔记和练习
  5. 案头参考:Part IV(标准库)和索引是日常工作中最常查阅的部分