侯捷 C++ 课程导读:从对象设计到标准库、内存与程序启动
C++ 的几个学习阶段经常被分开对待:先记语法,再背容器接口,再研究对象布局或内存分配。真正阅读一个库时,这些知识却会同时出现。一个容器怎样扩容,与元素的复制和移动有关;一个对象怎样构造,与其基类、成员和存储来源有关;main 怎样开始,又与运行库的初始化流程有关。
这组笔记把侯捷的六门课程当作相互连接的学习材料,沿着“如何设计对象—如何组织泛型算法—如何管理资源—程序怎样进入和退出运行”展开。文章采用 vibe watching 的整理方式:先理解课程的实际讲解和代码演化,再补上概念联系、现代版本的边界与可验证的练习。
先记住课程是谁讲的、原来叫什么
六门课的讲者均为侯捷,课程标题页有文字署名。本次采用 B 站账号 DetachmentSy 在 2025 年上传的版本,核对日期为 2026-09-12。上传者与讲者分别署名;原始录制年份尚未核实,不能根据上传日期判断课程年代。
上传标题适合识别眼前的视频,标题页的原课名则更适合在链接失效后寻找其他版本。下面保留两者之间的对应关系。机构一栏只记录画面中能读到的标识,不据此推断联合出品关系。
| 本文简称 | 标题页原课名 | 画面标识 | 本次上传入口 |
|---|---|---|---|
| 面向对象上册 | 《C++面向對象程序設計》 | GeekBand | BV1r6h5zgE2i |
| 面向对象下册 | 《C++程序設計 (II) 兼談對象模型》 | Boolan 博览、云课堂 | BV1kBh5zrEWL |
| STL | 《C++標準庫:體系結構與內核分析》 | Boolan 博览 | BV1kBh5zrEYh |
| C++11/14 | 《C++2.0 新特性(C++11/14)》 | Boolan 博览 | BV1wBh5zkE2Y |
| 内存管理 | 《內存管理:從平地到萬丈高樓》 | Boolan 博览、云课堂 | BV1d3h5zFEjL |
| Startup | 《C++程序的生前死後:揭密 CRT Startup code》 | Boolan 博览 | BV1jVhjzqEEu |
如果回放入口失效,可以用“侯捷 + 原课名 + 讲题或代码关键词”重新检索。找到其他上传版本后,需要重新对齐时间:前导画面、剪辑和分集方式都可能改变。各篇回看表因此同时保留讲题、时间区间与画面线索。
六门课程分别处在什么位置
| 课程 | 本次上传范围 | 主要学习问题 |
|---|---|---|
| C++ 面向对象高级开发(上) | 13 P,约 7 小时 45 分钟 | 一个类怎样定义有效接口,怎样处理值、资源与对象关系 |
| C++ 面向对象高级开发(下) | 24 P,约 5 小时 | 类型转换、模板和运行时对象模型怎样支撑更复杂的类设计 |
| STL 标准库和泛型编程 | 46 P,约 20 小时 4 分钟 | 容器、算法、迭代器、函数对象、适配器和分配器如何协作 |
| C++ 新标准 C++11 & 14 | 31 P,约 9 小时 44 分钟 | 新语言机制怎样改变初始化、泛型表达、调用和资源转移 |
| C++ 内存管理机制 | 60 P,约 14 小时 16 分钟 | 从 new/delete 到专用分配器,存储怎样申请、复用与释放 |
| C++ Startup 揭密:C++ 程序的生前和死后 | 11 P,约 4 小时 16 分钟 | 进入 main 之前与返回之后,运行库还承担哪些工作 |
这些数量描述的是本次可见的 B 站上传版本,共 185 个分 P、约 61 小时 6 分钟。Startup 的实际 P11 标题标为“12 c init Startup的第三项大工程”,上传标题存在跳号;不能据此补造不存在的分集,也不能把当前清单当成原课程所有内容均已保存的证明。
当前可以阅读的文章
六门课仍在逐讲转录、核对和整理。下面只列已经成稿的文章;上面的课程规模说明素材范围,不表示这些内容已经全部写入笔记。每篇来源卡和回看表分别说明实际覆盖的分 P。
| 课程 | 已成稿文章 | 对应上传分 P |
|---|---|---|
| 面向对象下册 | 从类的接口走向泛型与对象模型 | P1 |
| 面向对象下册 | 转换函数、构造函数与隐式转换 | P2–3 |
| 面向对象下册 | 指针式类与函数对象 | P4–5 |
| 面向对象下册 | auto、引用与重载选择 | P14 后半、P15 |
| STL | 从六部件合作理解泛型编程 | P1–2 |
| STL | vector 与 array:连续存储的两种契约 | P16–17 |
| STL | deque、queue 与 stack:分段存储与接口适配 | P18–19 |
| C++11/14 | 从语言新机制走进标准库实现 | P1 |
| 内存管理 | 从分配层次理解存储与对象 | P1–3 |
| Startup | 默认入口与 CRT 启动流程 | P1–3 |
怎样安排阅读顺序
如果已经会写简单 C++ 程序,但类的接口和资源管理还不熟悉,可以先从上册开始。把构造、复制、赋值和析构放回一个具体类的完整使用过程,再继续阅读下册的转换、模板与对象模型。
准备读 STL 源码时,需要能理解模板实例化、运算符重载、值语义以及对象生命周期。先读懂一个算法对迭代器提出什么要求,再追踪容器内部怎样满足这些要求,会比直接跳进复杂模板定义更有方向。C++11/14 课程可以与这条路线交叉阅读,尤其是移动语义与容器行为之间的联系。
内存管理与 Startup 更适合放在后面。前者继续追问“对象使用的存储从哪里来”,后者把局部视角扩展到进程与运行库。理解这些实现有助于分析性能和故障,但日常业务代码并不因此需要绕过 RAII,自己实现一套分配器。
区分语言规则、库契约与历史实现
课程包含多个历史版本的编译器、标准库与运行库实现。它们是观察设计权衡的具体材料,不是所有平台都必须采用的布局和调用链。
阅读时可以给每个结论标出它所在的层次:语言规定了什么,标准库对调用者承诺了什么,当前展示的实现选择了什么。比如,虚函数的可观察派发行为与某个编译器的虚表布局,不是同一层结论;分配器接口与 VC6 的小块堆结构,也不属于同一种保证。
现代补充会在各篇中明确标示。需要验证的不是“新写法一定更好”,而是换了语言版本或库实现以后,原有前提、复杂度、失效规则和资源契约是否仍然成立。
把笔记当成回看与实验的入口
先读一篇的概念关系和案例推导,找出自己无法解释的一步,再使用文中的重点回看表进入相应分 P 和时间区间。表中的课件标题、类名或关键词同样重要:如果原链接失效,或者找到的是另一个剪辑版本,它们能帮助重新定位。
接着用一个最小实验检验理解。可以改变一次复制的时机、让一次分配失败、换一种迭代器能力,或者比较两种初始化方式。先写下预期,再观察编译与运行结果,并说明结果依赖的语言版本和实现环境。思考题中的扩展方向不是课程已经证明的结论,而是继续学习的线索。
与本站已有文章连接时,可以参考 C++ 设计模式系列、折叠表达式、shared_ptr 引用计数源码阅读以及 Writing 总导读。语法、资源与依赖设计需要共同理解,不能只靠记住某个模式名称或库内部类名。