C++ 面试到底考什么,整理完你就懂了
刷了很多面经之后发现,C++ 面试的考察点其实很集中,不是漫无边际的,把这几个方向吃透,大部分面试都能应对。
一、内存管理
这是 C++ 面试出现频率最高的方向,几乎每场必问。
核心考点:
new/delete和malloc/free的区别,能不能混用- 栈、堆、全局区、代码段各存什么,生命周期是什么
- 内存泄漏的原因和排查方式
- 智能指针三兄弟,
unique_ptr、shared_ptr、weak_ptr的区别和使用场景 shared_ptr的引用计数实现原理,循环引用怎么产生怎么解决placement new是什么,什么时候用
面试官真正想考的不是你背没背过这些概念,而是你有没有在实际项目里踩过坑,能不能说出来为什么这么设计。
二、面向对象
C++ 的 OOP 特性是必考内容,但考法越来越偏向原理而不是概念。
核心考点:
- 虚函数表的结构,虚指针在对象内存里的位置
- 多继承时虚函数表怎么组织,菱形继承的问题和虚继承的解决方式
- 纯虚函数和抽象类,接口的设计
- 构造函数和析构函数的调用顺序,虚析构函数不加会有什么问题
- 对象切片问题,什么时候会发生
override和final关键字的作用
重点是虚函数表,这个考得很深,要能说清楚多继承时的内存布局。
C++面试常考题目类型都放入了专栏了:https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW
三、C++11 及之后的新特性
这块是近几年面试的高频区,说明你有没有跟上现代 C++ 的节奏。
核心考点:
- 移动语义和右值引用,
std::move做了什么,移动后原对象是什么状态 - 万能引用和完美转发,
std::forward解决了什么问题 lambda表达式的捕获方式,值捕获和引用捕获的区别auto和decltype的类型推导规则constexpr和编译期计算std::optional、std::variant、std::any的使用场景- 范围 for 循环的底层实现
移动语义是这块的重中之重,要能结合 vector 扩容、函数返回值等场景来解释。
四、模板和泛型编程
中大厂面试越来越喜欢考这块,因为能体现你对 C++ 的理解深度。
核心考点:
- 函数模板和类模板的基本用法
- 模板特化和偏特化的区别,什么时候用
- SFINAE 是什么,
std::enable_if怎么用 - 模板的实例化时机,为什么模板定义要放在头文件里
- 可变参数模板,
sizeof...运算符 - CRTP(奇异递归模板模式)是什么,解决了什么问题
- C++20 的 Concepts 了解吗
这块不需要全部精通,但至少要能说清楚 SFINAE 和模板特化,这是高频考点。
五、并发编程
多线程是 C++ 面试的必考方向,而且越来越深。
核心考点:
std::thread的基本用法,线程的生命周期管理std::mutex、std::shared_mutex、std::recursive_mutex的区别std::lock_guard和std::unique_lock的区别,什么时候用哪个- 条件变量
std::condition_variable的使用,为什么要用 while 而不是 if std::atomic的内存序,六种内存序分别是什么含义volatile和std::atomic的区别,volatile能保证线程安全吗- 死锁的产生条件和避免方法
- 优先级反转是什么,怎么解决
- 无锁编程,CAS 操作,ABA 问题
内存序是这块的难点,很多人说不清楚 acquire/release 的含义,能说清楚这个很加分。
六、STL 容器
这块考察频率很高,但深度要求也在提升,不能只会用。
核心考点:
vector的底层实现,扩容机制,扩容后迭代器为什么失效vector和list的区别,各自适合什么场景map和unordered_map的底层结构,时间复杂度,什么时候用哪个unordered_map的哈希冲突怎么解决,负载因子是什么deque的底层结构,为什么stack和queue默认用deque- 迭代器失效的场景,各个容器分别是什么情况
std::string的 SSO(小字符串优化)了解吗
重点是 vector 和 unordered_map,这两个考得最多,要能说清楚底层实现。
七、编译链接
这块很多人忽视,但大厂面试经常考,能体现你对 C++ 底层的理解。
核心考点:
- 编译的四个阶段:预处理、编译、汇编、链接,每个阶段做什么
- 静态库和动态库的区别,各自的优缺点
inline函数的作用,现代编译器会自动内联吗extern "C"是什么,为什么 C++ 调用 C 函数需要它- 符号可见性,
static修饰全局变量和函数的作用 - ODR(单一定义规则)是什么,违反了会怎样
- LTO(链接时优化)了解吗
这块不需要特别深,但编译四阶段和静态/动态库的区别要说清楚。
八、设计模式
大厂面试越来越喜欢考设计模式,考法是结合实际场景,不是背定义。
核心考点:
- 单例模式,线程安全的实现方式,为什么局部静态变量的方式是线程安全的
- RAII 是什么,解决了什么问题,举实际例子
- 观察者模式,发布订阅和观察者的区别
- 工厂模式,简单工厂、工厂方法、抽象工厂的区别
- 策略模式,什么时候用
- CRTP 实现静态多态,和虚函数动态多态的对比
重点是单例和 RAII,这两个几乎每场都会问。
九、性能优化
这块是区分普通候选人和优秀候选人的分水岭。
核心考点:
- 缓存友好的代码怎么写,AoS 和 SoA 的区别
- 伪共享(False Sharing)是什么,怎么避免
- 分支预测,
[[likely]]/[[unlikely]]的作用 - 内存池的设计思路,为什么比系统分配器快
- 零拷贝是什么,在什么场景下有价值
- 编译器优化选项,
-O2和-O3的区别 - 性能分析工具,perf、Valgrind、AddressSanitizer 怎么用
这块不需要全部精通,但要能结合项目说出来你做过什么优化,有没有实际的数据对比。
怎么准备
按重要程度排序:
内存管理 > 并发编程 > 面向对象 > STL 容器 > 新特性 > 模板 > 编译链接 > 设计模式 > 性能优化
前四个是基础,每场必考,要非常熟练。后面几个是加分项,能说清楚就比大多数人强。
最重要的一点:每个知识点都要能结合实际场景来说,光背概念没用,面试官一追问就露馅了。
查看3道真题和解析