The C++ Programming Language, 4th Edition 笔记
基本信息
- 书名: The C++ Programming Language, 4th Edition
- 作者: Bjarne Stroustrup (C++ 语言创始人)
- 版本: 第四版(基于 C++11 标准)
- 页数: 1366 页
- 文件大小: 5.67MB
核心理念
C++ 的设计哲学
- 零开销原则 (Zero-overhead principle): “What you don’t use you don’t pay for” — 如果一个特性没有被使用,它不应该带来任何性能开销。
- 贴近硬件: C++ 提供对硬件资源的直接映射,适合资源受限的系统编程。
- 灵活抽象: 用户定义类型应与内置类型具有相同的表示支持和性能。
- 类型安全: 静态类型系统是 C++ 表达力、可维护性和性能的核心。
- 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章)
- 在代码中直接表达想法(概念),例如作为函数、类或枚举
- 追求代码既优雅又高效
- 不要过度抽象
- 聚焦于提供优雅高效的抽象,可能以库的形式呈现
- 在代码中直接表达思想间的关系
- 将独立的想法分开表达
- C++ 不仅仅是面向对象的语言
- C++ 不仅仅是泛型编程语言
- 优先选择可以静态检查的解决方案
- 让资源显式化(作为类对象表示)
- 简单想法用简单方式表达
- 使用库(尤其是标准库),而不是从头构建
- 使用类型丰富的编程风格
- 不要因害怕性能问题而避免类、模板和标准库组件
- 如果数据有不变量,封装它
- C++ 不仅仅是带扩展的 C
与其他参考书的对比
| 书名 | 作者 | 特点 | 适用场景 |
|---|---|---|---|
| 本书 | Bjarne Stroustrup | 全面参考,语言创始人撰写 | 深入理解 C++ 标准 |
| A Tour of C++ | Bjarne Stroustrup | 精简版,快速概览 | 已有经验者快速了解 C++11 |
| Effective C++ | Scott Meyers | 55条具体建议 | 提升 C++ 编码技巧 |
| Effective Modern C++ | Scott Meyers | 42条现代C++建议 | C++11/14 最佳实践 |
| C++ Concurrency in Action | Anthony Williams | 并发编程专著 | 多线程编程 |
| The Design and Evolution of C++ | Bjarne Stroustrup | 设计思想历史 | 理解设计决策 |
学习建议
- 不要试图一次读完所有细节:本书同时兼具教程和参考书性质,可以按需阅读
- 善用索引和交叉引用:熟悉后可以直接查阅特定章节
- 结合标准库使用: Bare language features 会让编程很痛苦,库才是关键
- 实践最重要:编写 realistically sized programs 才能体会语言特点
- C++11 是质的飞跃:与 C++98 相比,现代 C++ 代码更简洁、更安全、更高效