# Day 1 · 开训 + C++ 回顾/工具链

# Day 1

### 开训 + C++ 回顾/工具链

C++/Qt 方向实训 · 第 1 / 5 天 · 对齐官方方案书 Day1

- 模块 A（3 课时）：团队建设 / 敏捷 Scrum / C++ 在企业中的应用（讨论型，无编码）
- 模块 B（3 课时）：C++ 环境搭建 / 高级程序回顾 / CMake / Vcpkg（压缩讲解）

本教案假定学员已掌握 C++ 基础语法与 OOP 概念——方案书对今天下午的 官方定位是"回顾和提升"，不是零基础教学。今天开始的 5 天覆盖方案书 C++方向 Day1–5 全部课堂内容，Day6–10 是纯项目实作。

#### 模块 B 开始前：10 分钟摸底测验

这条假设不是拍脑袋定的——建议模块 B 讲授前先用 docs/teaching/PRETEST.md （10 题、10 分钟）实测一次，按结果决定原节奏推进还是回退到语法讲解。

模块 A · 讲授 35min

## 团队建设 / 敏捷 Scrum / C++ 企业应用 讲

- 团队建设与文化、实训安排与考评要求
- 项目开发过程管理全景（JIRA / Git / OASIS / Wiki）
- 敏捷 Scrum 项目开发管理
- C++ 在企业中的应用

### 实习实训服务流程 讲

出处：docs/TRAINING_PLAN_2026.md 「六、实习实训服务流程」

### 服务流程：核心概念 讲

#### 核心概念

- 需求分析→需求评审→项目研发/代码实现→阶段评审→项目测试/交付——每个环节都有明确的 "评审"节点把关，不是写完代码就结束，这就是接下来 Day6–10 项目实作要走的完整流程。

#### 常见误区

- 把"需求分析"当成走过场：跳过评审直接开始编码，后期返工成本远高于前期多花时间对齐需求。

### 质量保证：四平台一标准 讲

出处：docs/TRAINING_PLAN_2026.md 「七、质量保证」

### 四平台一标准：核心概念 讲

#### 核心概念

- JIRA（任务跟踪）+ Git（版本管理）+ Wiki 知识库 + OASIS 绿洲实训管理平台，四个工具 分别对应"谁在做什么/代码怎么变化/知识怎么沉淀/进度怎么被看到"四个不同维度，缺一个都会 让协作出现盲区。

#### 常见误区

- 只用 Git 不用 Jira：代码有了版本历史，但"谁负责什么、进度到哪"没有可见记录， 团队协作时容易重复劳动或漏项。

模块 A · 讨论 95min（分组，非编码）

## 动手：分组讨论 议

今天上午没有编码练习——先把协作流程和项目方向定下来，Day6–10 的项目实作会真的用到今天讨论的结论。

#### 任务卡 1 · 协作分工 议

目标
  结合服务流程图，说清楚本组打算怎么分工使用 Jira（任务跟踪）+ Git（代码版本管理）
验收标准
  每组提交一句话分工说明（谁负责建 Jira 看板 / 谁负责 Git 仓库初始化），能在图上指出对应环节
基础知识 · 参考
  上一节"实习实训服务流程"图 · TRAINING_PLAN_2026.md 「七、质量保证 (一)(二)」

#### 任务卡 2 · 选定项目方向 议

目标
  选定实训期间打算做的项目方向（Linux C 方向，或 C++/Qt 方向的备选商业项目之一）
验收标准
  每组报出项目名称 + 一句话说明选择理由
基础知识 · 参考
  TRAINING_PLAN_2026.md 「八、备选商业项目介绍」

模块 B · 讲授 35min（巡礼式，压缩讲解）

## C++ 回顾 / CMake / Vcpkg 讲

只挑「学过但容易讲不透」的点，不逐章展开——方案书官方定位是 "回顾和提升"，深度让位于 Day2–5 的 Qt 内容。

### namespace 作用域 讲

#### 核心概念

- "作用域"不是"文件顺序"——很多人误以为 namespace 只是给名字加前缀，实际上它定义的是 一段可以被跨文件延续、跨块合并的作用域，同一个命名空间可以在多个文件里反复打开、追加内容。

#### 常见的坑

- 在头文件里写 `using namespace std;`：会把整个命名空间污染带给所有 include 这个头文件的地方，容易引发命名冲突，规范做法是只在 .cpp 里用，或干脆不用、 全程写限定名。

出处：p01/ch03/namespace_syntax.cpp， 对照 docs/ERRATA.md

### 函数重载决议 讲

#### 核心概念

- 编译器靠"名字改写"（name mangling）把重载函数变成不同的符号；二义性往往不是代码写 错了，而是重载集合里存在两个"一样好"的候选，编译器无法替你选。

#### 常见的坑

- 隐式类型转换会扩大重载候选集——比如 `int`/`double` 都能转 `float` 参数，传一个 `long` 进去可能触发意料之外的重载版本。

出处：p01/ch03/function_overload_mechanism.cpp

### 引用的本质 讲

#### 核心概念

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

#### 常见的坑

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

出处：p01/ch03/reference_essence.cpp

### 虚析构与内存泄漏 讲

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

#### 核心概念

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

#### 常见的坑

- 只要一个类可能被继承、且可能通过基类指针删除派生对象，就应该把析构函数声明为 `virtual`——即使当前基类本身没什么要清理的，这是个防御性约定。

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

### 模板与 STL 速览 讲

#### 核心概念

- 只点名，不展开：泛型编程（函数模板/类模板）让同一份代码适配不同类型，容器/迭代器 是 Day6–10 项目实作里会大量用到的基础设施——迭代器是"容器和算法之间的统一接口"，这也是 STL 能让算法脱离具体容器类型复用的关键。

#### 常见的坑

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

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

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

#### 核心概念——每 3 年一次实打实的能力升级，不是小修小补

- C++11（"现代 C++ 元年"）：`auto` 类型推导、智能指针 `unique_ptr`/`shared_ptr`（RAII 终结手动 `new`/`delete`）、 右值引用 `&&` + 移动语义（消除不必要的拷贝）、lambda 表达式、 语言级并发 `std::thread`/`mutex`/`atomic`、 `nullptr`、`constexpr`。
- C++14：泛型 lambda（参数写 `auto`）、函数返回类型自动推导、 `std::make_unique` 补齐。
- C++17：结构化绑定 `auto [a,b] = pair`、`if`/`switch` 带初始化语句、`std::optional`/`variant`/`string_view`、 标准库终于有跨平台的 `std::filesystem`。
- C++20（号称"自 C++11 以来最大的一次变革"）：concepts 概念（模板约束，报错从 几百行天书变成一句话）、ranges 范围库（`view | filter | transform` 管道式组合）、 coroutines 协程（`co_await` 把异步代码写成同步的样子）、modules 模块（挑战头文件 体系）、`<=>` 三路比较一行换 6 个运算符。

#### 常见的坑

- 新标准 ≠ 现在能用：生产环境的编译器/CI 常年落后最新标准 1–2 个版本，用新特性前先确认 目标工具链 `-std=` 支持到哪。本仓库出于教学稳定性选 C++17 作为基线（顶层 `CMakeLists.txt`），可用 `tools/std_probe.py` 自己验证某特性最早从哪个 标准开始能编译（宿主 gcc 13.3 原生支持到 C++23）。

#### 缺口说明

本节为纯概念巡礼，无对应仓库示例——具体新特性的动手练习超出本次"C++回顾"压缩讲解范畴， 感兴趣可用 `tools/std_probe.py` + `tools/demo_versions/` 自行探索 （参见 docs/VERSION_NOTES.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 工程，`cmake --build` 才是 真正编译。`option(BUILD_QT_PART)` 控制是否编译 Qt 部分，每个示例一个 `add_executable` 目标，这就是"一文件一目标"约定的由来。

#### 常见的坑

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

出处：仓库根 CMakeLists.txt

### Vcpkg 包管理器（概念，无演示） 讲

#### 核心概念

- C++ 生态的包管理器，解决"第三方库怎么装、怎么被 CMake 找到"的问题——一次 `vcpkg install`，配合 CMake 的 toolchain 文件，`find_package` 就能自动找到头文件和库。

#### 常见的坑

- 不是所有第三方库都必须用包管理器装——本仓库用的是"隔离 Qt 手动装" （`tools/install_qt_host.sh`）而非 vcpkg，两种思路都要认识：包管理器省心但 引入额外工具链，手动隔离装则精确控制版本/路径，各有取舍。

#### 缺口说明

本仓库暂无 vcpkg 可运行示例——安装真实 vcpkg 工具链超出最小示例范畴，此处仅作概念介绍。

模块 B · 练习 95min

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

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

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

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

目标
  从 docs/ERRATA.md 挑 2 条记录，理解"wiki 原文错在哪、现在的写法为什么对"
验收标准
  能用一句话向同组同学解释清楚，不能只念代码
基础知识 · 参考
  docs/ERRATA.md

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

目标
  用 `tools/std_probe.py` 验证一个标准版本差异点（如三目运算符可否作左值）
验收标准
  跑出至少一个"该标准报错、另一个标准不报错"的对比结果，对照 docs/VERSION_NOTES.md §2
基础知识 · 参考
  tools/std_probe.py · docs/VERSION_NOTES.md

## 当日产出验证

#### 验收

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

每组提交一句话分工说明 + 至少 1 条 ERRATA 坑点讲解。

返回目录 · 下一天 →