Appearance
C++ 学习路径
C++ 面试不是把语法点平铺背完,而是建立一条从语言规则 → 对象与资源 → 标准库与泛型 → 并发与工程的主线。本文是 C++ 模块入口:首次学习按推荐顺序阅读;面试前可按“问题定位”直接跳到相关页面。
从哪里开始
不需要一次读完所有内容。推荐先完成前三阶段,能够覆盖多数 C++ 基础面试题;再根据目标岗位补齐并发、性能、诊断和系统接口边界。
推荐学习顺序
1. 语言与程序基础:先知道代码如何存在和运行
- 基础、存储期与内存:作用域、存储期、
static、const、栈帧、内存布局; - 类型推导、值类别与语言规则:
auto、decltype、值类别、默认实参、重载、mutable、string_view; - C++ 翻译、链接与 ABI:预处理、翻译单元、ODR、静态/动态库和
extern "C"。
完成标准:能区分作用域、存储期与链接属性;能解释一个 .cpp 如何成为可执行程序;不把“栈/堆”当作 C++ 生命周期的唯一描述。
2. 对象、资源与抽象:C++ 最核心的工程能力
- 面向对象与多态:封装、继承、虚函数、构造/析构与覆盖;
- 指针、资源与智能指针:所有权、RAII、
unique_ptr、shared_ptr、生命周期; - 异常安全、栈展开与资源清理:基本/强/不抛异常保证与资源回收;
- 对象模型、RTTI 与多态设计:多重/虚继承、
dynamic_cast、variant的边界; - 字节操作与 C API 边界:
void*、对象生命周期、memcpy/memmove、C 字符串与对齐。
完成标准:能先说清资源由谁拥有、何时释放,再讨论指针或多态;能解释为什么多态基类通常需要虚析构函数。
3. 标准库、现代特性与泛型:让代码既正确又表达清楚
- STL 容器:容器选择、扩容、哈希、迭代器失效;
- STL 算法与数据聚合模式:算法优先、比较器、聚合和受控并发读取;
- 现代 C++:移动语义、
noexcept、Lambda 与闭包; - 模板、Concepts 与 C++20:实例化、SFINAE、Concepts、Ranges 和协程。
完成标准:能根据访问模式选择容器,知道迭代器失效条件;能解释 std::move 只是值类别转换,模板代码为何通常放在头文件。
4. 并发、异步与运行期工程:在正确性基础上处理真实负载
- 并发与多线程:锁、原子、内存序、条件变量、队列和线程池;
- 回调、线程生命周期与异步任务:
std::function、回调生命周期、jthread、async; - 缓存友好与性能设计:数据布局、批处理、测量与优化边界;
- 调试、Core Dump 与运行期诊断:GDB、core、Sanitizer 与故障定位。
完成标准:能先用锁和 RAII 给出正确方案,再讨论无锁;能区分性能猜测与压测/剖析结论。
5. 设计专题:放在主线之后理解取舍
- 单例模式:唯一性、全局状态、可测试性、生命周期与依赖注入。
单例不是“基础语法题”,应在掌握所有权、静态初始化和并发边界后再讨论其适用性。
版本策略:C++17 主线,C++20–26 分层扩展
本站示例默认以 C++17 为面试和工程基线;若使用更高版本特性,会在对应页面明确写出版本与实现边界,而不是让读者误以为所有编译器都可直接使用。
| 层级 | 学习定位 | 优先关注的主题 |
|---|---|---|
| C++17:主线必学 | 大多数项目和面试可直接使用的共同基础 | 结构化绑定、if 初始化、inline static、optional/variant/any、string_view、文件系统、std::pmr |
| C++20:重要进阶 | 新项目与中高级岗位常见 | Concepts、Ranges、协程、jthread/停止令牌、span、format、模块、三路比较 |
| C++23:按需补充 | 库能力和表达力增强 | expected、mdspan、print、stacktrace、move_only_function 等 |
| C++26:前沿扩展 | 以工具链支持为前提,不作为基础回答前提 | 合同、静态反射、执行模型及新增容器/库能力等;使用前检查编译器、标准库和 feature-test macro |
学习时先写出 C++17 可工作的方案,再回答“高版本如何简化”。涉及 C++23/26 时,应主动说明:标准版本、编译器/标准库支持情况,以及是否需要 feature-test macro 兜底。
按问题快速定位
| 你想解决的问题 | 优先阅读 |
|---|---|
变量何时创建、销毁,static / const 有何区别 | 基础、存储期与内存 → 语言规则 |
new、智能指针、悬空指针和 RAII 如何解释 | 指针、资源与智能指针 → 异常安全 |
| 虚函数、虚析构、RTTI、多继承怎么回答 | 面向对象与多态 → 对象模型与 RTTI |
该选 vector、map 还是 unordered_map | STL 容器 |
| 移动语义、Lambda、模板、Ranges 或协程 | 现代 C++ → 模板、Concepts 与 C++20 |
| 线程安全、队列、原子和内存序 | 并发与多线程 |
| 崩溃、泄漏、未定义行为和性能问题 | 运行期诊断 → 性能设计 |
| 要与 C 库、字节缓冲区或 ABI 交互 | 字节操作与 C API 边界 → 翻译、链接与 ABI |
面试复习方法
每完成一个阶段,按同一模板复述一个知识点:
- 结论:它解决什么问题;
- 机制与不变量:语言或库保证什么、自己必须维护什么;
- 复杂度/生命周期/并发边界:代价和失效条件是什么;
- 工程选择:何时使用、何时换成更简单或更安全的方案;
- 追问:列出一个常见误区并给出修正。
这样阅读路径既可用于从零建立框架,也可在面试前沿着侧边栏按阶段快速查漏补缺。