CS106L 现代 C++:Standard C++ Programming · 开篇与课程概览
课程:Stanford CS106L “Standard C++ Programming”(2026 春季学期) 讲师:Rachel Fernandez、Preston Seay(
cs106l-spr2526-staff@lists.stanford.edu) 课程主页:https://web.stanford.edu/class/cs106l/(存档页:https://web.stanford.edu/class/archive/cs/cs106l/cs106l.1266/) 上课时间:周二、周四 15:00–16:20,Thornton 110 课程性质:1 学分(S/NC),第 8 周结束正式课程,共 7 个短作业、无考试 本笔记依据:课程主页公开日程表、全部 17 份公开讲座幻灯片(PDF)、公开的课堂代码仓库(cs106l-lecture-code)与作业仓库(cs106l-assignments)
课程概览(About CS106L)
课程目标与定位
🌽 CS106L 是一门深入探索现代 C++ 语言的 1 学分课程。 与 CS106B 等”用 C++ 讲概念”的课程不同,CS106L 关注的是代码本身:什么是好的、强大而优雅的 C++ 代码。课程覆盖现代 C++ 中最激动人心的特性,包括现代编程范式(直至 C++26),并只使用标准库(STL),不依赖任何 Stanford 私有库——让你真正理解 C++ 是如何被设计出来的,以及为什么。
- 🥦 先修要求:正在学习或已学过 CS106B/X(或同等水平),即已掌握函数、对象/类等编程基础。
- 🥕 课程形式:7 个非常简短的周作业(每个约 1–2 小时,周五发布、下周五截止,共 3 个免费晚交天数)。作业不追求难度,而是对上周课堂概念的动手练习。无考试、无论文,全部 S/NC 评分。
- 🏢 答疑(Office Hours):对所有人开放,第 3 周开始。周四 16:30–17:20(Thornton 210)、周三 15:00–15:50(160-B37)。
为什么学 C++?
- C++ 是”一切事物的隐形地基”:游戏引擎(Valorant、CS2)、高频交易、自动驾驶、Arduino、GPU 编程、数据库(MySQL、MongoDB)、浏览器(Chrome)、VR(Quest)、底层 ML 框架(PyTorch、TensorFlow)、编译器/虚拟机(LLVM、GCC、JVM)、操作系统(Windows、macOS、Linux)……
- C++ 于 1985 年首次发布,至今仍稳居 TIOBE 指数前三(2026 年 3 月数据);标准每三年修订一次:
C++98 → C++03 → C++11 → C++14 → C++17 → C++20 → C++23 → C++26。 - C++ 帮助养成优秀的”编码卫生”:类型检查与类型安全、引用/拷贝/移动语义下的内存效率、
const正确性——这些限制正是许多其他语言所放宽的。
C++ 设计哲学(本笔记贯穿始终的准绳)
- 直接在代码中表达想法与意图(express ideas and intent directly in code)。
- 尽可能在编译期强制安全(enforce safety at compile time whenever possible)。
- 不浪费时间和空间(do not waste time or space)。
- 封装杂乱的结构(compartmentalize messy constructs)。
- 把完全的控制、责任与选择权交给程序员(allow the programmer full control, responsibility, and choice)。
“Code should be elegant and efficient; I hate to have to choose between those.” —— Bjarne Stroustrup
学习方法建议
- 本笔记每讲严格按”概述 → 核心特性与语法详解 → 代码示例与逐步解说 → 与旧标准对比 → 关键要点 → 常见陷阱 → 关联作业提示“七段式组织;代码示例均标注所需 C++ 标准(C++11/14/17/20/23/26)且尽可能可直接编译运行。
- 建议:先通读概述与关键要点,再精读语法详解,最后动手编译运行每个代码示例,对照”特性机制解说”理解底层机制。
- 常用参考:https://en.cppreference.com(官方标准参考,课程推荐);Godbolt Compiler Explorer(https://godbolt.org)用于观察编译产物。
课程日程表(Schedule)
| 周次 | 周二(Tuesday) | 周四(Thursday) | 周五发布作业 |
|---|---|---|---|
| Week 1 | 3/31 L1. Welcome!(📖 Slides) | 4/2 L2. Types & Structs(📖 Slides,💻 Code) | — |
| Week 2 | 4/7 L3. Initialization & References(📖 Slides,💻 Code) | 4/9 L4. Streams(📖 Slides,💻 Code) | A1: SimpleEnroll |
| Week 3 | 4/14 L5. Containers(📖 Slides,💻 Code) | 4/16 L6. Iterators & Pointers(📖 Slides,💻 Code) | A2: Marriage Pact |
| Week 4 | 4/21 L7. Classes(📖 Slides,💻 Code) | 4/23 L8. Optional: Inheritance Practice(📖 Slides,💻 Code) | A3: Make a Class! |
| Week 5 | 4/28 L9. Class Templates & Const Correctness(📖 Slides,💻 Code) | 4/30 L10. Function Templates(📖 Slides,💻 Code) | A4: Ispell |
| Week 6 | 5/5 L11. Functions & Lambdas(📖 Slides) | 5/7 L12. Operator Overloading(📖 Slides,💻 Code) | A5: Treebook |
| Week 7 | 5/12 L13. Special Member Functions(📖 Slides,💻 Code) | 5/14 L14. Move Semantics(📖 Slides,💻 Code) | A6: ExploreCourses |
| Week 8 | 5/19 L15. std::optional & Type Safety(📖 Slides,💻 Code) | 5/21 L16. RAII, Smart Pointers, & Building C++ Projects(📖 Slides,💻 Code) | A7: Unique Pointer |
| Week 9 | 5/26 L17. Optional Lecture: C++ Iceberg(📖 Slides,💻 Code) | 5/28 无课 | — |
| Week 10 | 无课 | 无课 | — |
作业总览(Assignments)
| 作业 | 名称 | 主题 / 考察技能 | 说明 |
|---|---|---|---|
| A1 | SimpleEnroll | 流(streams)、初始化、引用 | 用 ExploreCourses 数据判断哪些 CS 课程本学期开设 |
| A2 | Marriage Pact | STL 容器、指针 | 用容器与指针完成”配对”逻辑(含简答题) |
| A3 | Make a Class! | 类、头文件/源文件分离 | 自由设计一个类(class.h / class.cpp / sandbox.cpp) |
| A4 | Ispell | 模板、<algorithm>、ranges | 实现 Unix 拼写检查器核心逻辑(spellcheck) |
| A5 | Treebook | 运算符重载、特殊成员函数 | 实现社交网络 User 类的 operator<<、operator==、SMF 等 |
| A6 | ExploreCourses | std::optional、monadic 操作 | 在课程数据库中查找可能不存在的 Course,返回 std::optional |
| A7 | Unique Pointer | RAII、智能指针、模板、移动语义 | 从零实现一个简化版 std::unique_ptr |
访问性说明:作业详细文档、练习视频、答题平台(Paperless、Ed、Canvas 内页)等需要斯坦福账号登录,未公开。本笔记主要依据课程主页公开的日程表、主题描述、公开幻灯片与公开 GitHub 代码仓库构建知识框架。
