The C++ Programming Language, 4th Edition 笔记

基本信息

  • 书名: The C++ Programming Language, 4th Edition
  • 作者: Bjarne Stroustrup (C++ 语言创始人)
  • 版本: 第四版(基于 C++11 标准)
  • 页数: 1366 页
  • 文件大小: 5.67MB

核心理念

C++ 的设计哲学

  1. 零开销原则 (Zero-overhead principle): “What you don’t use you don’t pay for” — 如果一个特性没有被使用,它不应该带来任何性能开销。
  2. 贴近硬件: C++ 提供对硬件资源的直接映射,适合资源受限的系统编程。
  3. 灵活抽象: 用户定义类型应与内置类型具有相同的表示支持和性能。
  4. 类型安全: 静态类型系统是 C++ 表达力、可维护性和性能的核心。
  5. C 兼容: C++ 保留了 C 作为子集,但并非追求 100% 兼容(会牺牲类型安全)。

编程风格综合

C++ 支持四种编程风格的综合使用,而非单一风格:

  • 过程式编程: C 的风格,关注数据处理和数据结构设计
  • 数据抽象: 设计接口,隐藏实现细节
  • 面向对象编程: 类层次结构的设计、实现和使用
  • 泛型编程: 设计通用算法,通过模板实现编译时多态

Stroustrup 强调:“只关注其中一种风格是错误的”。最佳解决方案往往是多种风格的组合。


书籍结构

Part I: Introduction (第1-5章)

  • 第1章:读者指南和 C++ 历史背景
  • 第2章:C++ 快速概览 - 基础(内存模型、计算、错误处理)
  • 第3章:C++ 快速概览 - 抽象机制
  • 第4章:C++ 快速概览 - 容器和算法
  • 第5章:C++ 快速概览 - 并发和工具

Part II: Basic Facilities (第6-15章)

基础设施,支持传统 C 风格的编程:

  • 第6章:类型和声明
  • 第7章:指针、数组和引用
  • 第8章:结构体、联合和枚举
  • 第9章:语句
  • 第10章:表达式
  • 第11章:选择操作
  • 第12章:函数
  • 第13章:异常处理(重点:RAII)
  • 第14章:命名空间
  • 第15章:源文件和程序

Part III: Abstraction Mechanisms (第16-29章)

抽象机制,支持面向对象和泛型编程:

  • 第16-19章:类(核心抽象机制)
  • 第20-22章:类层次结构(继承、多态、RTTI)
  • 第23-28章:模板(泛型编程核心)
  • 第29章:矩阵设计案例

Part IV: The Standard Library (第30-44章)

标准库详解:

  • 第30-33章:STL(容器、算法、迭代器)
  • 第34-35章:内存和资源管理、工具
  • 第36-37章:字符串、正则表达式
  • 第38-39章:I/O 流、区域设置
  • 第40章:数值计算
  • 第41-42章:并发(内存模型、线程和任务)
  • 第43-44章:C 标准库、兼容性

C++11 核心新特性

语言特性

特性描述主要贡献者
=delete / =default控制默认行为Lawrence Crowl, Bjarne Stroustrup
auto类型推导Bjarne Stroustrup
constexpr常量表达式求值Gabriel Dos Reis, Bjarne Stroustrup
Lambda 表达式隐式定义函数对象Jaakko Järvi
移动语义cheap 传输信息而非拷贝Howard Hinnant
noexcept声明函数不抛出异常David Abrahams 等
nullptr空指针字面量Herb Sutter, Bjarne Stroustrup
范围 for 循环简化遍历Thorsten Ottosen, Bjarne Stroustrup
final / override覆盖控制Alisdair Meredith 等
类型别名模板别名等Bjarne Stroustrup 等
enum class类型化枚举David E. Miller 等
统一初始化{} 初始化列表Bjarne Stroustrup 等
可变参数模板任意数量参数Doug Gregor, Jaakko Järvi

标准库新特性

  • 哈希容器: unordered_map, unordered_set
  • 并发库: thread, mutex, lock, future, promise, async()
  • 智能指针: unique_ptr, shared_ptr
  • 正则表达式: regex
  • 随机数: 完整的随机数库
  • 元组: tuple
  • 函数对象: function, bind()

关键概念详解

RAII (Resource Acquisition Is Initialization)

资源获取即初始化。将资源生命周期与对象生命周期绑定,确保资源自动释放。这是 C++ 异常安全和资源管理的核心模式。

移动语义 (Move Semantics)

C++11 引入,允许对象的所有权转移而非拷贝,显著提升性能。核心是:

  • 移动构造函数
  • 移动赋值运算符
  • std::move() 函数
  • 右值引用 (&&)

智能指针

  • unique_ptr: 独占所有权,不可拷贝,可移动
  • shared_ptr: 共享所有权,引用计数
  • weak_ptr: 解决 shared_ptr 循环引用问题

零开销原则的体现

  • 模板实例化在编译时完成,无运行时开销
  • 内联函数消除函数调用开销
  • 虚函数表是按需使用的
  • 用户定义的类型与内置类型性能相当

设计建议(来自第1章)

  1. 在代码中直接表达想法(概念),例如作为函数、类或枚举
  2. 追求代码既优雅又高效
  3. 不要过度抽象
  4. 聚焦于提供优雅高效的抽象,可能以库的形式呈现
  5. 在代码中直接表达思想间的关系
  6. 将独立的想法分开表达
  7. C++ 不仅仅是面向对象的语言
  8. C++ 不仅仅是泛型编程语言
  9. 优先选择可以静态检查的解决方案
  10. 让资源显式化(作为类对象表示)
  11. 简单想法用简单方式表达
  12. 使用库(尤其是标准库),而不是从头构建
  13. 使用类型丰富的编程风格
  14. 不要因害怕性能问题而避免类、模板和标准库组件
  15. 如果数据有不变量,封装它
  16. C++ 不仅仅是带扩展的 C

与其他参考书的对比

书名作者特点适用场景
本书Bjarne Stroustrup全面参考,语言创始人撰写深入理解 C++ 标准
A Tour of C++Bjarne Stroustrup精简版,快速概览已有经验者快速了解 C++11
Effective C++Scott Meyers55条具体建议提升 C++ 编码技巧
Effective Modern C++Scott Meyers42条现代C++建议C++11/14 最佳实践
C++ Concurrency in ActionAnthony Williams并发编程专著多线程编程
The Design and Evolution of C++Bjarne Stroustrup设计思想历史理解设计决策

学习建议

  1. 不要试图一次读完所有细节:本书同时兼具教程和参考书性质,可以按需阅读
  2. 善用索引和交叉引用:熟悉后可以直接查阅特定章节
  3. 结合标准库使用: Bare language features 会让编程很痛苦,库才是关键
  4. 实践最重要:编写 realistically sized programs 才能体会语言特点
  5. C++11 是质的飞跃:与 C++98 相比,现代 C++ 代码更简洁、更安全、更高效

关联笔记