From 9765865d132d66a5f39b9420d58f552a32ba47ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=97=E5=B9=B3?= Date: Thu, 2 Jul 2026 16:41:48 +0800 Subject: [PATCH] =?UTF-8?q?Day1=20C++=20=E5=9B=9E=E9=A1=BE=E8=A1=A5?= =?UTF-8?q?=E4=B8=80=E5=B0=8F=E8=8A=82=EF=BC=9AC++11/14/17/20+=20=E6=96=B0?= =?UTF-8?q?=E6=A0=87=E5=87=86=E5=B7=A1=E7=A4=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原「C++ 环境搭建/高级程序回顾」只覆盖语言老知识点(namespace/重载/引用/ 虚析构/模板),没有让学员感受到 C++ 这些年一直在大幅进化。新增一个概念性 知识点(无配套代码,同 Vcpkg 那一条的先例):按标准列出 C++11→20 的核心 新特性(auto/智能指针/移动语义/lambda → concepts/ranges/协程/模块), 并提醒"新标准≠生产环境能直接用",挂钩本仓库自身的 C++17 基线选择和 tools/std_probe.py。OUTLINE.md 表格行/核心概念条目与 day1.html 新增幻灯片 一一对应。 --- docs/teaching/OUTLINE.md | 6 ++++++ docs/teaching/slides/day1.html | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/docs/teaching/OUTLINE.md b/docs/teaching/OUTLINE.md index 90420a2..37e8910 100644 --- a/docs/teaching/OUTLINE.md +++ b/docs/teaching/OUTLINE.md @@ -132,6 +132,7 @@ Day2–5 讲:练 ≈ 1:2.7;Day1 模块 A 是讨论型任务(不追求"练" | 引用的本质 | `p01/ch03/reference_essence.cpp` | "引用是自动解引用的 const 指针" | | 虚析构与内存泄漏 | `p01/ch04/s08/virtual_dtor_purpose.cpp` | 基类指针 delete 派生类对象的经典坑 | | 模板与 STL 速览 | `p01/ch05/class_template_basics.cpp`、`p01/ch09/s03/vector_iterator.cpp` | 泛型编程 + 容器/迭代器,只点名不展开 | +| C++11/14/17/20+ 新标准巡礼(概念,无演示) | 无仓库代码 | 让学员看到 C++ 不是停滞的语言:auto/智能指针/移动语义/lambda(11) → concepts/ranges/协程(20),每 3 年一次实打实的能力升级 | | CMake 项目构建 | 本仓库 `CMakeLists.txt`、`p03/CMakeLists.txt` | 用真实项目当教材:`option(BUILD_QT_PART)`、`add_subdirectory`、每个示例一个 `add_executable` 目标 | | Vcpkg 包管理器(概念,无演示) | 无仓库代码 | C++ 生态的包管理器,解决"第三方库怎么装、怎么被 CMake 找到"的问题;本仓库用的是"隔离 Qt 手动装"而非 vcpkg,两种思路都要认识 | @@ -148,6 +149,11 @@ Day2–5 讲:练 ≈ 1:2.7;Day1 模块 A 是讨论型任务(不追求"练" 派生类析构;坑——只要类可能被继承+可能被基类指针删除,就该把析构声明为 virtual。 - **模板与 STL 速览**:概念——泛型编程让代码脱离具体类型复用,迭代器是容器与算法之间的统一 接口;坑——容器扩容/删除元素后旧迭代器可能失效,继续用是未定义行为。 +- **C++11/14/17/20+ 新标准巡礼**:概念——C++11(auto/智能指针/移动语义/lambda/语言级线程) + → C++14(泛型 lambda/返回类型推导)→ C++17(结构化绑定/if-init/optional·variant·string_view/ + filesystem)→ C++20(concepts/ranges/协程/模块/三路比较),每个标准都是实打实的能力升级, + 不是小修小补;坑——新标准不等于现在能用,生产环境编译器/CI 常年落后最新标准 1–2 个版本, + 用新特性前先确认目标工具链 `-std=` 支持到哪(可用 `tools/std_probe.py` 自己验证)。 - **CMake 项目构建**:概念——CMake 是"生成构建系统的工具"而非构建系统本身,`-S -B` 生成、 `--build` 才是真正编译;坑——改了生成器相关配置(换生成器/清缓存)后要重新走一次 `-S -B`。 - **Vcpkg 包管理器**:概念——一次 `vcpkg install` 配合 CMake toolchain 文件,`find_package` diff --git a/docs/teaching/slides/day1.html b/docs/teaching/slides/day1.html index 80851eb..c9156ae 100644 --- a/docs/teaching/slides/day1.html +++ b/docs/teaching/slides/day1.html @@ -250,6 +250,44 @@ delete p; // 如果 ~Base() 不是 virtual,~Derived() 不会被调用—— 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、 + nullptrconstexpr
  • +
  • C++14:泛型 lambda(参数写 auto)、函数返回类型自动推导、 + std::make_unique 补齐。
  • +
  • C++17:结构化绑定 auto [a,b] = pairif/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