Standard C++ 基础回炉|00:Phase 1 总览与学习路线
从对象与生命周期重新开始,按 RAII、所有权、移动语义、STL、模板和对象模型的顺序,恢复现代 C++ 的基本功。
Standard C++ 基础回炉|00:Phase 1 总览与学习路线
这一阶段不是重新背一遍语法,而是把长期使用 Qt 后容易被框架遮住的 C++ 基础重新建立起来。
最终需要做到:离开 QString、QVector、QObject 和 Qt 的对象树以后,仍然能够清楚回答一段代码里的对象何时创建、由谁拥有、何时销毁,以及异常和提前返回时资源是否安全释放。
阶段目标
完成 Phase 1 后,应当能够独立解释并使用:
- 对象、作用域、存储期和生命周期
- RAII 与异常安全
- 值语义、引用语义和所有权
std::unique_ptr、std::shared_ptr与std::weak_ptr- 拷贝、移动与 Rule of 0/3/5
- STL 容器、迭代器和失效规则
- Algorithm、Lambda 与泛型思维
- 模板的实例化与基本特化
- 运行时多态、对象切片与组合优先
- 内存布局、对齐与缓存行的基本概念
学习顺序
| 序号 | 主题 | 核心问题 | 输出 |
|---|---|---|---|
| 01 | 对象、存储期与生命周期 | 对象何时存在,何时已经失效? | 生命周期跟踪实验 |
| 02 | RAII 与资源管理 | 提前返回或异常时,资源如何可靠释放? | 文件或句柄封装类 |
| 03 | 拷贝、移动与 Rule of 0/5 | 一个类型应当复制资源还是转移资源? | 带移动语义的小型缓冲区 |
| 04 | 智能指针与所有权 | 谁拥有对象,谁只是观察对象? | 所有权关系图与示例 |
| 05 | STL 容器与迭代器 | 为什么选择这个容器,什么时候引用会失效? | 容器对比实验 |
| 06 | Algorithm 与 Lambda | 如何从“手写循环”转向“表达意图”? | 数据处理练习 |
| 07 | 模板基础 | 泛型代码何时生成,错误为什么难读? | 函数模板与类模板 |
| 08 | 多态与对象模型 | 动态分派付出了什么成本? | 继承与组合对比 |
| 09 | 内存布局与对齐 | 字段顺序为什么影响大小? | sizeof / alignof 实验 |
| 10 | 阶段综合验收 | 能否独立设计一个资源安全的类型? | 小型容器与完整复盘 |
当前课程索引
00:阶段总览
第 1 课:对象、生命周期与失效
第一课的重点不是记住零散规则,而是建立一条统一的判断链:
名字是否可见 → 对象是否仍在生命周期内 → 谁拥有对象 → 当前指针、引用或迭代器是否仍然有效。
| 子篇 | 内容 | 重点 |
|---|---|---|
| 1-1 | 对象、存储期与生命周期 | 建立作用域、存储期、生命周期和所有权的基础模型 |
| 1-2 | 悬空指针与 AddressSanitizer | 用栈上悬空访问理解未定义行为,并学习阅读 ASan 报告 |
| 1-3 | 函数返回对象、移动语义与 RVO/NRVO | 区分危险的返回地址与安全的按值返回 |
| 1-4 | vector 扩容与引用失效 | 把生命周期判断扩展到容器的指针、引用和迭代器 |
| 1-5 | 生命周期与所有权综合复盘 | 用 8 个核心问题检查是否真正掌握第一课 |
建议按 1-1 → 1-2 → 1-3 → 1-4 → 1-5 阅读。前三篇建立核心模型,1-4 是容器场景扩展,1-5 负责综合验收并衔接后续课程。
第 2 课:RAII 与资源管理
课程进度
- 建立 Phase 1 学习索引
- 第 01 课:对象、存储期与生命周期
- 第 02 课:RAII 与资源管理
- 第 03 课:拷贝、移动与 Rule of 0/5
- 第 04 课:智能指针与所有权
- 第 05 课:STL 容器与迭代器
- 第 06 课:Algorithm 与 Lambda
- 第 07 课:模板基础
- 第 08 课:多态与对象模型
- 第 09 课:内存布局与对齐
- 第 10 课:综合验收
固定学习方法
每个主题按同一套循环推进:
- 先写出当前理解,不查资料。
- 阅读概念并运行最小示例。
- 修改示例,主动制造编译错误、悬空引用或资源泄漏。
- 使用编译器警告和 Sanitizer 定位问题。
- 不看资料重新实现练习。
- 用自己的话解释设计取舍。
建议所有练习至少使用以下警告级别:
g++ -std=c++17 -Wall -Wextra -Wpedantic -Wconversion -g main.cpp
涉及内存和生命周期时,再开启检查器:
g++ -std=c++17 -Wall -Wextra -Wpedantic -g \
-fsanitize=address,undefined main.cpp
阶段完成标准
“看过”不算完成。至少需要满足:
- 不查资料实现一个具有明确所有权的小型资源类型。
- 能解释其构造、析构、拷贝和移动行为。
- 能指出代码中的悬空引用、重复释放和迭代器失效风险。
- 在 ASan 与 UBSan 下运行练习,没有未处理报告。
- 能说明为什么优先使用 Rule of 0,而不是到处手写析构函数。
- 能在 Code Review 中用“生命周期”和“所有权”说明问题,而不只说“这里可能崩溃”。