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 -BCMakeLists.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.cppp01/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 结果已归档(决定后续调速)。

返回目录 · 下一天 →