学习8 分钟阅读编辑本文 ↗

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对象、存储期与生命周期对象何时存在,何时已经失效?生命周期跟踪实验
02RAII 与资源管理提前返回或异常时,资源如何可靠释放?文件或句柄封装类
03拷贝、移动与 Rule of 0/5一个类型应当复制资源还是转移资源?带移动语义的小型缓冲区
04智能指针与所有权谁拥有对象,谁只是观察对象?所有权关系图与示例
05STL 容器与迭代器为什么选择这个容器,什么时候引用会失效?容器对比实验
06Algorithm 与 Lambda如何从“手写循环”转向“表达意图”?数据处理练习
07模板基础泛型代码何时生成,错误为什么难读?函数模板与类模板
08多态与对象模型动态分派付出了什么成本?继承与组合对比
09内存布局与对齐字段顺序为什么影响大小?sizeof / alignof 实验
10阶段综合验收能否独立设计一个资源安全的类型?小型容器与完整复盘

当前课程索引

00:阶段总览

第 1 课:对象、生命周期与失效

第一课的重点不是记住零散规则,而是建立一条统一的判断链:

名字是否可见 → 对象是否仍在生命周期内 → 谁拥有对象 → 当前指针、引用或迭代器是否仍然有效。

子篇内容重点
1-1对象、存储期与生命周期建立作用域、存储期、生命周期和所有权的基础模型
1-2悬空指针与 AddressSanitizer用栈上悬空访问理解未定义行为,并学习阅读 ASan 报告
1-3函数返回对象、移动语义与 RVO/NRVO区分危险的返回地址与安全的按值返回
1-4vector 扩容与引用失效把生命周期判断扩展到容器的指针、引用和迭代器
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 课:综合验收

固定学习方法

每个主题按同一套循环推进:

  1. 先写出当前理解,不查资料。
  2. 阅读概念并运行最小示例。
  3. 修改示例,主动制造编译错误、悬空引用或资源泄漏。
  4. 使用编译器警告和 Sanitizer 定位问题。
  5. 不看资料重新实现练习。
  6. 用自己的话解释设计取舍。

建议所有练习至少使用以下警告级别:

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 中用“生命周期”和“所有权”说明问题,而不只说“这里可能崩溃”。