《The C++ Programming Language, 4th Edition》学习笔记

基本信息

  • 书名: The C++ Programming Language, 4th Edition
  • 作者: Bjarne Stroustrup (C++之父)
  • 版本: 第4版(基于C++11标准)
  • 出版社: Addison-Wesley
  • 出版年份: 2013
  • 文件大小: 5.9 MB
  • 总页数: 约1400页

核心设计理念

编程语言的设计目标

C++是一门通用编程语言,主要特点:

  1. 高效性: 提供对硬件的直接映射,支持底层编程
  2. 抽象机制: 支持用户定义类型,抽象机制开销为零
  3. 零开销原则: 不使用特性的代码不产生额外开销
  4. 直接映射: 内置类型和操作直接映射到硬件

四种编程风格

C++支持四种主要的编程风格,可以组合使用:

风格核心思想C++支持方式
过程式编程关注数据处理和算法设计内置类型、运算符、函数、struct、union
数据抽象关注接口设计,隐藏实现细节类、private/public访问控制、构造函数/析构函数
面向对象编程关注类层次的设计、实现和使用派生类、虚函数、多继承、RTTI
泛型编程关注通用算法的设计模板、概念(concepts)、元编程

类型系统的重要性

  • 静态类型检查是C++的核心特性
  • 丰富的类型系统支持更好的错误检测和优化
  • 用户定义类型与内置类型享有同等地位
  • 类型安全不是追求”保密”或”防欺诈”,而是防止意外错误

C++11新特性(第4版重点)

语言特性

  1. Uniform Initialization(统一初始化): {} 列表初始化
  2. Move Semantics(移动语义): 高效传输大对象
  3. Lambda Expressions(lambda表达式): 隐式定义函数对象
  4. auto类型推导: 从初始化器推断类型
  5. constexpr常量表达式: 编译时计算
  6. noexcept异常规范: 声明函数不抛出异常
  7. nullptr: 空指针字面量
  8. range-based for循环: 简化遍历
  9. Variadic Templates(变长模板): 任意参数数量的模板
  10. User-defined Literals(用户定义字面量)

标准库增强

  1. 并发支持: thread、mutex、lock_guard、future、async
  2. 智能指针: unique_ptr、shared_ptr
  3. 哈希表容器: unordered_map、unordered_set
  4. 正则表达式: regex
  5. 随机数: random库
  6. tuple: 固定大小异构容器
  7. function绑定: 通用函数包装器

学习建议

核心原则

  1. 直接表达想法: 用代码直接表示设计中的概念
  2. 独立表达独立想法: 避免不必要的依赖
  3. 简洁表达简单想法: 不要过度抽象
  4. 使用类型丰富风格: 用类型区分不同概念

对C程序员建议

  1. 不要用C风格写C++
  2. 使用标准库(string、vector)代替C风格字符串和数组
  3. 使用const和constexpr代替宏定义常量
  4. 使用RAII管理资源,避免裸new/delete
  5. 使用异常而非错误码报告错误

对Java程序员建议

  1. C++不需要垃圾回收器
  2. 不要创建Object基类
  3. 谨慎使用指针和引用
  4. 不是所有类都适合继承
  5. 使用RAII而不是try-finally

C++历史演进

时间线

  • 1979: 开始开发”C with Classes”
  • 1983: 改名为C++
  • 1985: 首个商业发布,第一版《The C++ Programming Language》出版
  • 1990: Annotated C++ Reference Manual (ARM)
  • 1998: ISO C++标准(C++98),引入STL
  • 2011: C++11标准,引入现代C++特性

设计原则

  1. 不留更低层语言空间: 如果在更低层语言能写更高效代码,它会成为系统编程首选
  2. 不使用不付费: 不使用某特性就不产生开销
  3. 问题驱动: 从实际应用需求出发,而非模仿其他语言

关键概念

RAII(资源获取即初始化)

  • 将资源管理绑定到对象生命周期
  • 构造函数获取资源,析构函数释放资源
  • 异常安全且高效

类型丰富风格(Type-rich Style)

  • 用不同类型区分不同概念
  • 编译器帮助发现类型错误
  • 提高代码可读性和可维护性

编译期多态 vs 运行期多态

  • 编译期: 模板、inline、constexpr
  • 运行期: 虚函数、dynamic_cast、typeid

与其他语言的比较

特性C++Java/C#Python
内存管理手动/智能指针垃圾回收垃圾回收
类型检查静态+强类型静态+强类型动态+强类型
泛型模板泛型鸭子类型
并发线程、atomic线程、JVMGIL限制
性能接近C较好较低

适用场景

  • 系统编程: 操作系统、驱动、虚拟机
  • 高性能应用: 游戏引擎、金融系统、搜索引擎
  • 嵌入式系统: 资源受限环境
  • 科学计算: 数值计算、仿真
  • 基础设施: 数据库、网络栈、编译器

相关资源

  • ISO C++标准: ISO/IEC 14882
  • C++标准委员会: WG21工作组
  • 在线资源: www.stroustrup.com
  • 标准库参考: cppreference.com

行动建议

  1. 阅读第4版前5章了解现代C++概貌
  2. 重点掌握RAII、智能指针、lambda、move语义
  3. 多写代码,理解类型系统的设计思想
  4. 避免C/Java风格写C++
  5. 关注C++11/14/17/20标准演进