README
# 卷二 · 综合案例总导读(6 案例精品版)
本卷是**卷一《语法卷》**的配套实战篇。学完卷一第 2-18 章基础语法后,通过 6 个层层递进的精品案例把散落的知识点串起来,形成"能独立写项目"的能力。
其中第 6 个 MiniKVStore(迷你 KV 存储引擎) 是"集大成的毕业设计",一口气覆盖卷一全部 17 章。
# 01.定位与使用方式
本卷的每一篇都按 "照着写 · 抄得懂 · 改得动" 三个层次设计:
- 照着写:每个小节先给需求、再给代码片段,初学者跟着键入即可跑通——所有代码均按"小白手把手"的步骤拆解,一步一步写、一步一步测。
- 抄得懂:代码后必有"为什么这样写 / 关键机制原理 / 新手陷阱"小节,回答"C++ 为什么不能像 Python 那样随手写"。
- 改得动:每篇结尾留 3 个"延伸挑战",鼓励读者用新学的特性重构。
代码标准:以 C++17 为基线,兼容 C++20/23 新特性(会明确标注);编译器建议 GCC ≥ 10 / Clang ≥ 12 / MSVC ≥ 19.30;构建系统推荐 CMake ≥ 3.16。
学习方式:建议每个案例独立创建一个目录,跟着教程边读边写——看一段、敲一段、跑一段。完成一个案例约需 3-18 小时(按难度递增),全部 6 个案例预计 65 小时完成。
# 02.6 案例总览
本卷采用"业务连贯 + 技术演进"双主线设计:前 5 个案例围绕"校园/企业管理系统"展开,每个案例都是上一个的"自然进化";第 6 个是毕业设计,把所有能力合一。
| # | 案例 | 难度 | 时长 | 核心主题 | 卷一前置 |
|---|---|---|---|---|---|
| 01 | 学生通讯录系统 (opens new window) | ★☆☆☆☆ | 3 h | C 风格起步:struct + 数组 + 函数拆分 + cin/cout | 第 2-7 章 |
| 02 | 银行账户管理系统 (opens new window) | ★★★☆☆ | 8 h | OOP 进化:class 封装 + 多态(普通/VIP/储蓄账户)+ CSV 持久化 | 第 8-10、13 章 |
| 03 | 校园身份预约系统 (opens new window) | ★★★★☆ | 10 h | 抽象身份 + STL 全家桶(vector/map/multimap)+ 多模块文件矩阵 + lambda 排序 | 第 9-10、13、16 章 |
| 04 | JSON 序列化器与内存数据库 | ★★★★☆ | 12 h | 现代内存模型:variant + 递归 + 智能指针 + 异常体系 + optional/string_view | 第 8、11-12、14、18 章 |
| 05 | 多线程订单系统与线程池 | ★★★★★ | 14 h | 并发栈:thread/mutex/condition_variable/atomic/future/jthread + 策略模式 | 第 11-12、15-16 章 |
| 06 | 迷你 KV 存储引擎 🎓 | ★★★★★ | 18 h | 毕业设计:命令模式 + AOF 持久化 + 读写锁 + jthread 后台 + 宏 + 模板 + <=> + 内置单测 | 第 2-18 全章 |
🎓 第 6 个案例是"毕业设计"——前 5 个案例每个聚焦一个技术栈,第 6 个把所有能力合并为一个工业级 KV 数据库。
# 03.章节—案例覆盖矩阵(100% 全覆盖自检)
下表展示卷一每章在本卷的落地点。读者可反向使用——"我想练习智能指针,去找第 04 案例"。
| 卷一章节 | 核心知识点 | 主覆盖案例 | 辅助覆盖 |
|---|---|---|---|
| 02 基础语法 | cin/cout、菜单循环 | 01 | 全部 |
| 03 数据类型 | string、auto、enum class | 01 | 02、04、06 |
| 04 运算符 | 运算符重载、<=> | 06(KV 三路比较) | 02(运算符重载)、05(原子运算) |
| 05 复合类型 | struct、vector、array | 01 | 03、04、06 |
| 06 流程语句 | switch、范围 for、结构化绑定 | 01 | 全部 |
| 07 函数 | lambda、引用传参、默认参数 | 01 | 03(lambda 排序)、05(lambda 任务) |
| 08 指针引用 | 裸指针 → 智能指针 | 04(JSON 节点) | 02、06 |
| 09 类与对象 | 封装、五法则、构造析构 | 02 | 03、04、06 |
| 10 继承与多态 | 抽象类、虚函数、override | 02 银行三态 / 03 身份三态 / 06 命令模式 | 04(JSON 节点) |
| 11 内存模型 | 栈/堆/全局/静态分区 | 04(生命周期图)/ 05(线程栈) | 06 |
| 12 动态内存 RAII | unique_ptr/shared_ptr | 04 JSON / 05 锁 RAII | 06(全 RAII) |
| 13 IO 与文件 | fstream、filesystem | 02 CSV / 03 文件矩阵 | 04、06 AOF |
| 14 异常处理 | try/catch、noexcept | 04(JSON 异常体系)/ 06(KvError) | 05 |
| 15 线程和锁 | thread、mutex、jthread | 05 | 06(shared_mutex) |
| 16 STL 模板 | vector/map/泛型 | 03(STL 全家桶) | 04、05、06 |
| 17 预处理器 | #define、__FILE__、Modules | 06(KV_LOG 宏 + 单测宏) | 05(日志宏) |
| 18 特性图谱 | variant/optional/string_view | 04(variant 主场) | 06(集成) |
✅ 表中加粗的是"该章的首选案例",新手可按此顺序学。所有 17 章全部有主覆盖案例,无遗漏。
# 04.推荐学习路径
# 路径 A:新手线(按顺序通读,强烈推荐)
01 通讯录(C 风格起步,3 h)
↓ 升级为 class + 多态 + 文件
02 银行账户(OOP 大考,8 h)
↓ 抽象身份 + 加 STL
03 校园预约(STL 全家桶,10 h)
↓ 加现代内存 + 异常
04 JSON + 内存数据库(现代 C++,12 h)
↓ 加并发能力
05 多线程订单 + 线程池(并发栈,14 h)
↓ 集大成
06 MiniKVStore(毕业设计,18 h)
2
3
4
5
6
7
8
9
10
11
总耗时约 65 小时,相当于:每天 2 小时 × 33 天 / 周末全天 × 8 周。
# 路径 B:带 C 基础转 C++(按主题跳读)
OOP 主题: 02(多态三态)→ 03(抽象身份)→ 06(命令模式)
现代内存主题: 04(智能指针 + variant)→ 06(全 RAII)
并发主题: 05(mutex/cv/future/jthread)→ 06(shared_mutex)
工程主题: 04(异常体系)→ 05(线程池组件)→ 06(宏 + 单测)
2
3
4
# 路径 C:快速查漏(按卷一章节反查)
| 想练 | 去看哪个案例 |
|---|---|
| 多态 / 虚函数 | 02、03、06 |
| 智能指针 / RAII | 04、05、06 |
| 异常处理 | 04、06 |
| STL 容器与算法 | 03、06 |
| 多线程并发 | 05、06 |
| 宏与模板 | 06 |
| 一次性串完卷一所有章节 | 直接做 06 |
# 05.案例间承接关系(业务+技术双线)
01 学生通讯录(C struct)
│
│ 痛点:"数据存内存就够了吗?" → 数据要持久化
│ 痛点:"一个 struct 怎么表达多种角色?" → 需要继承
▼
02 银行账户管理(class + 多态 + CSV)
│
│ 痛点:"三种账户的类还能怎么扩展?" → 抽象身份接口
│ 痛点:"数组+find() 太低效?" → 用 STL map/multimap
▼
03 校园身份预约(多态 + STL 全家桶)
│
│ 痛点:"CSV 太死板,能存嵌套数据吗?" → 需要 JSON
│ 痛点:"手动 new/delete 容易漏?" → 智能指针
▼
04 JSON 序列化器 + 内存数据库(现代内存模型)
│
│ 痛点:"单线程访问太慢?" → 加并发
│ 痛点:"多个线程同时改怎么办?" → 锁 + 同步原语
▼
05 多线程订单系统 + 线程池(并发栈)
│
│ 痛点:"想把所有能力合一做一个真实产品?" → 毕业设计
▼
06 MiniKV 存储引擎(卷一 17 章全章串联)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 06.统一的写作约定
为保证 6 个案例"看起来像一本书",本卷遵循以下统一约定:
# 6.1 每篇结构模板
# NN.案例名
> 上一案例的痛点 → 本案例如何解决(一句话)
## 00.案例元信息
- 难度:★★★☆☆
- 预估时长:X 小时
- 前置章节:卷一第 X/Y/Z 章
- 覆盖知识点:(矩阵表)
- 项目结构:(目录树)
- 编译命令:(一条命令跑通)
- 学习路径建议:(边读边写的 6 个阶段)
## 01.需求说明
(需求 / 功能 / 设计思路 / 涉及知识点)
## 02.菜单或主框架
(先搭骨架,让程序能跑起来)
## 03~0N.分步骤实现
(每个功能:需求 → 代码 → 测试 → 原理 → 陷阱)
## 0N.项目总结
- 代码整体结构
- 核心原理
- 优缺点分析
## 0N+1.项目技术思考
(本案例最值得思考的 2-3 个问题)
## 0N+2.衔接与延伸
- 与上一案例的差异(对比表)
- 下一案例的递进点
- 3 个延伸挑战(基础 / 进阶 / 现代化)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 6.2 代码风格
| 项目 | 约定 |
|---|---|
| 命名 | 类 PascalCase、函数/变量 camelCase、常量 UPPER_SNAKE |
| 命名空间 | 教学代码用 using namespace std; 简化;工程代码(05、06)明确写 std:: |
| 头文件保护 | #pragma once(现代写法) |
| 空指针 | 一律 nullptr,禁止 NULL / 0 |
| 内存 | 案例 01-03 允许裸 new/delete(教学反例);案例 04 起全面 RAII |
| 标准 | 基线 C++17;用到 C++20 特性会标注 🆕 C++20 |
| 错误处理 | 用户输入校验用返回码;资源/越界/解析失败用异常 |
# 6.3 术语统一
| 术语 | 本卷统一译法 |
|---|---|
| member function | 成员函数(不用"方法") |
| instance | 对象(不用"实例",除了 STL 章) |
| pointer | 指针(裸指针称"raw pointer") |
| smart pointer | 智能指针 |
| lambda | Lambda 表达式(首字母大写) |
# 07.常见疑问 FAQ
Q1:为什么从 12 个案例精简为 6 个?
A:原 12 个案例存在三组重复——"02 银行 + 03 职工"都是 OOP+CSV,"05 演讲 + 06 机房"都是 STL+文件矩阵,"07 票务 + 08 轮询 + 09 线程池"都是并发。精简后每个案例只聚焦一个核心技术栈,认知负担减轻,章节覆盖反而更完整(从 16/17 提升到 17/17)。
Q2:6 个案例之间能跳着学吗?
A:前 5 个建议按顺序学,因为存在数据/技术承接关系(如案例 02 的 Account 类会在案例 03 升级为 User 抽象基类、案例 04 用智能指针重构案例 03 的裸指针)。第 6 个毕业设计可以等前 5 个学完后再做,体感会有"原来如此"的爽感。
Q3:为什么案例 01 仍然用 struct 和裸数组?
A:卷一第 5 章先讲 struct,第 9 章才讲 class。01 故意保留"C 风格 C++"作为历史对照,让读者在 02 看到"类化"后的同一问题,体会封装的价值。
Q4:为什么案例 02、03 里还有 new T[N] 这样的裸指针?
A:这两个案例的主题是多态(卷一第 10 章),此时还没学到 RAII(第 12 章)。我们保留裸指针版本,等案例 04 再统一升级为 std::unique_ptr<Node>,让读者亲眼看到"同一份代码,RAII 版本少了多少行 delete"。
Q5:第 6 个 MiniKVStore 和前 5 个是什么关系?
A:前 5 个每篇覆盖卷一 3-5 章,是"专题练习";第 6 个是毕业设计——一个项目把卷一 17 章串起来。它不是"加难度",而是"换视角":从"练单点"切到"做系统"。建议分 5 次(每次 3-4 小时)完成,分别对应 MVP / 命令模式 / 异常+持久化 / 并发+TTL / 单元测试。
Q6:完成 6 个案例后我的水平能到哪?
A:参考下方"学习效果检验标准"——具备阅读开源 C++ 项目的能力,能独立开发中小型 C++ 应用,可以无缝进入卷二《工程卷》和卷三《底层卷》的学习。
# 08.学习效果检验标准
完成本卷 6 个案例后,你应该能够:
✅ 基础能力
- 熟练使用 C++17/20 核心特性(auto / lambda / variant / optional / 智能指针 / 范围 for)
- 理解面向对象设计原则(封装 / 继承 / 多态 / 五法则)
- 掌握 STL 容器和算法组合(vector / map / unordered_map / sort / find_if)
✅ 工程能力
- 设计可维护的多文件项目架构(实体层 / 管理层 / 持久化层 / 交互层)
- 实现多线程安全程序(mutex / condition_variable / atomic / future)
- 构建完整的项目构建系统(多文件 g++ / CMake)
✅ 系统思维
- 从需求分析到代码实现的全流程能力
- 性能优化和内存管理意识(栈 vs 堆、值传 vs 引用传 vs 指针传)
- 错误处理和异常安全设计(错误码 vs 异常 / RAII 异常安全)
✅ 进阶准备
- 为学习操作系统、网络编程打下基础
- 具备阅读开源 C++ 项目(如 Redis / LevelDB / nlohmann/json)的能力
- 能够独立开发中小型 C++ 应用,无缝进入卷二《工程卷》
# 09.与其他卷的衔接
- 卷一《语法卷》:本卷是它的验收考。做不动的话回头复习对应章节。
- 卷三《底层卷》:本卷案例 05 的线程池只做到"够用";想看无锁队列、原子内存序、协程,去卷三第 7-10 章。
- 卷四《工程与源码卷》:本卷案例 06 的单元测试是手写版;工程实战用 Google Test / Catch2,详见卷四。
# 10.反馈
发现 bug、想法、希望增加的案例?欢迎到仓库提 Issue。祝你在 6 个案例里找到"会 C++"的那一刻。
特别提示:建议在学习过程中为每个案例创建独立的 Git 分支,记录自己的实现过程和思考。完成所有案例后,你将拥有一个展示你 C++ 技能成长的完整作品集。