# Day 1

### 开训 + C++ 回顾与提升（全天 C++）

C++/Qt 方向实训 · 第 1 / 4 个讲授日 · 对齐 2026-07 新版 10 天安排

- 上午（08:30–11:00 讲 / 11:00–12:00 练）：开训 · C++ 技术版图 · 环境与 CMake · OOP 回顾
- 下午（13:30–16:00 讲 / 16:00–17:00 作业）：继承与多态 · 内存管理 · STL 常用容器

本教案假定学员已掌握 C++ 基础语法与 OOP 概念——今天定位是"回顾和提升"， 不是零基础教学。Day1–4 讲授，Day5 综合案例，Day6–10 项目开发与答辩。 大纲：docs/teaching/OUTLINE_4DAY.md

#### OOP 回顾开讲前：10 分钟摸底测验

受众假设要实测——用 docs/teaching/PRETEST.md （10 题、10 分钟、A/B 平行卷）测一次，按结果决定回顾环节推进速度（分层预案见该文件）。

上午 · 讲授 08:30–11:00（讲 25–30min + 随堂练 10–15min 循环）

## 开训 / C++ 技术版图 / 环境与 CMake / OOP 回顾 讲

- 开训典礼：团队文化 · 实训安排 · 考评要求（组织方主持）
- C++ 常用技术和框架（讲座）
- 开发环境搭建 + Makefile/CMake 项目构建
- PRETEST 摸底（10min）→ 面向对象基础回顾（类/对象/封装）

### C++ 常用技术和框架（讲座） 讲

#### 核心概念——C++ 的四大应用版图

- 桌面客户端：Qt（本次实训主线）、跨平台 GUI；
- 服务端/基础设施：高性能网络服务、数据库引擎、游戏服务器；
- 嵌入式/车载：资源受限环境里 C++ 仍是第一梯队选择；
- 游戏/图形：UE 引擎、渲染管线。

#### 而且它还在进化

- C++11 起三年一版：11「几乎新语言」→ 17 实用大件 → 20 四大件（Concepts/Ranges/协程/模块）。 今天下午末尾有专门一页巡礼；深入自学： MODERN_CPP.md · MODERN_CPP_20PLUS.md

### CMake：用本仓库当教材 讲

    cmake -S . -B build -G Ninja -DBUILD_QT_PART=OFF -DCMAKE_BUILD_TYPE=Debug
    cmake --build build   # 144 个目标全绿

#### 核心概念

- CMake 是"生成构建系统的工具"而不是构建系统本身：`cmake -S -B` 读 `CMakeLists.txt` 生成 Ninja/Makefile 工程（Makefile 是它的生成目标之一—— 这就是两者的关系），`cmake --build` 才是真正编译。 `option(BUILD_QT_PART)` 控制是否编译 Qt 部分，每个示例一个 `add_executable` 目标。

#### 常见的坑

- 改了 `CMakeLists.txt` 却没重新配置：大多数改动 CMake 会自动侦测， 但换生成器/清缓存后需要重新走一次 `-S -B`。

出处：仓库根 CMakeLists.txt · 包管理器一分钟：vcpkg 用 toolchain 文件让 `find_package` 自动找到三方库； 本仓库选"隔离 Qt 手动装"，两种思路都要认识。

### ★ 编译错误 vs 链接错误：排查方向完全不同 讲

    main.cpp:12:5: error: 'foo' was not declared     ← 编译期：带文件行号
    main.o: undefined reference to `Widget::bar()'   ← 链接期：没有行号

#### 核心概念

- `error:` 带行号 = 编译期问题（语法/类型/没声明）——回代码里查那一行； `undefined reference` 无行号 = 链接期问题（有声明没定义/缺库/缺目标文件）—— 查"定义在哪、链没链进来"，回头检查语法是南辕北辙。

#### 常见的坑

- 中初级学员见到 `undefined reference` 的第一反应是检查拼写和语法——方向就错了。 明天 Qt 的"忘写 `Q_OBJECT`"报的正是链接错误，且报错完全不提宏，记住今天这页。

### OOP 回顾：类 / 对象 / 封装 + namespace 讲

#### 核心概念

- 封装 = 数据和操作绑定 + 访问控制（public/private 是给"人"划的边界，不是安全机制）； 构造/析构对应对象生命周期的两端——这个心智模型下午的"所有权"还要用。
- namespace 的"作用域"不是"文件顺序"：可跨文件延续、跨块合并。

#### 常见的坑

- 头文件里 `using namespace std;` 会把命名空间污染带给所有 include 它的 地方——只在 .cpp 用，或全程写限定名。

出处：p01/ch04/（类与对象各节）、 p01/ch03/namespace_syntax.cpp， 对照 docs/ERRATA.md

上午 · 课堂练习 11:00–12:00（工程师指导、答疑）

## 动手：走一遍真实构建流程 练

#### 任务卡 1 · 走一遍真实构建流程 练

目标
  独立完成本仓库 Part1 的配置+构建，不看着教师操作
验收标准
  `cmake -S . -B build -G Ninja -DBUILD_QT_PART=OFF` 配置成功； `cmake --build build` 144 个目标全绿；能说出 `option(BUILD_QT_PART)` 的作用
基础知识 · 参考
  仓库根 CMakeLists.txt · CMake 官方文档 Tutorial（选读·需联网）

下午 · 讲授 13:30–16:00

## 继承与多态 / 内存管理 / STL 讲

- C++ 核心特性：继承与多态、虚函数（含虚析构）
- 内存管理：指针、引用与动态分配（含★所有权模型）
- STL 常用容器简介
- 收尾：现代 C++ 巡礼（兴趣钩子）

### 函数重载决议 讲

#### 核心概念

- 编译器靠"名字改写"（name mangling）把重载函数变成不同符号；二义性往往不是代码写错， 而是重载集合里有两个"一样好"的候选，编译器无法替你选。重载(编译期,同类内) vs 重写(运行期,继承体系) 是两码事。

#### 常见的坑

- 隐式类型转换会扩大重载候选集——传一个 `long` 进去可能触发意料之外的重载版本。

出处：p01/ch03/function_overload_mechanism.cpp

### 虚函数与虚析构 讲

    Base* p = new Derived();
    delete p;   // 如果 ~Base() 不是 virtual，~Derived() 不会被调用——经典泄漏

#### 核心概念

- 通过基类指针 `delete` 派生类对象时，只有基类析构是 `virtual` 才会走虚函数表找到派生类析构——"多态"在析构场景下的具体体现。

#### 常见的坑

- 只要类可能被继承 + 可能经基类指针删除，析构就该 `virtual`——防御性约定。 （明天会看到 Qt 的 QObject 体系全线虚析构。）

出处：p01/ch04/s08/virtual_dtor_purpose.cpp

### 引用的本质 讲

#### 核心概念

- 把引用理解成"自动解引用的 const 指针"——这个实现视角能解释为什么必须初始化、 为什么不能重新绑定。

#### 常见的坑

- 返回局部变量的引用：函数结束局部变量已销毁，引用悬空，访问是未定义行为—— 和返回局部变量指针同一类坑。

出处：p01/ch03/reference_essence.cpp

### ★ 所有权：谁负责 delete？ 讲

#### 核心概念

- 内存管理的核心问题不是"会不会 new"，而是"这块资源归谁管、由谁释放"。 现代答案是 RAII/智能指针：`unique_ptr` 独占所有权、`shared_ptr` 共享所有权（详见 MODERN_CPP.md §2）。 一个对象只能有一个所有者。

#### 常见的坑

- 双重释放、忘记释放、释放后使用——三兄弟全部源于所有权不明。
- 明天的伏笔：Qt 用"父子树"回答同一个问题（parent 析构自动 delete 子对象）。 两套所有权体系不能混用——交给 Qt 树管的对象，不要再用智能指针/栈/手动 delete 管。

### 模板与 STL 常用容器 讲

#### 核心概念

- 泛型编程让同一份代码适配不同类型；`vector`/`map`/`string` 是项目实作三件套；迭代器是"容器和算法之间的统一接口"——STL 算法能脱离具体容器复用的关键。

#### 常见的坑

- 容器扩容/删除元素后，旧迭代器可能失效（如 `vector` 扩容搬家），继续用是 未定义行为——遍历中增删元素前先弄清该容器的失效规则。

出处：p01/ch05/class_template_basics.cpp、 p01/ch09/s03/vector_iterator.cpp

### 钩子 · C++11/14/17/20+：一门仍在进化的语言 讲

#### 核心概念——每 3 年一次实打实的能力升级

- C++11：auto · 智能指针 · 移动语义 · lambda · 语言级并发 —— "现代 C++ 元年"；
- C++14：泛型 lambda · 返回类型推导 · `make_unique`；
- C++17：结构化绑定 · if-init · optional/variant/string_view · filesystem（本仓库基线）；
- C++20：Concepts · Ranges · 协程 · 模块 —— "自 C++11 以来最大变革"。

#### 常见的坑

- 新标准 ≠ 现在能用：生产工具链常年落后 1–2 版。用 `tools/std_probe.py` 自己验证某特性从哪个标准开始能编译（宿主 gcc 13.3 支持到 C++23）。

自学入口：MODERN_CPP.md（11/14/17， 示例全部可在本仓库基线下编译） · MODERN_CPP_20PLUS.md（20/23/26 前瞻， 含本机 GCC 实测矩阵）

下午 · 课堂作业 16:00–17:00（工程师答疑）

## 作业 练

#### 任务卡 2 · 修一个真实的坑 练

目标
  从 docs/ERRATA.md 挑 2 条与今天知识点相关的记录（虚析构/引用/重载类），理解"wiki 原文错在哪、为什么"
验收标准
  能用一句话向同组同学解释清楚，不能只念代码
基础知识 · 参考
  docs/ERRATA.md

#### 任务卡 3（选做）· 版本探针 练

目标
  用 `tools/std_probe.py` 验证一个标准版本差异点
验收标准
  跑出至少一个"该标准报错、另一个标准不报错"的对比，对照 docs/VERSION_NOTES.md §2
基础知识 · 参考
  tools/std_probe.py

## 当日产出验证

#### 验收

    cmake --build build --target all   # Part1，144 个目标全绿

每人完成构建全绿 + 2 条 ERRATA 坑点讲解；PRETEST 结果已归档（决定后续调速）。

返回目录 · 下一天 →