C++ 面试真不难,反反复复都是这些题
前言
C++ 面试看起来题量大、跨度广,从语法细节到 STL、从内存管理到并发,好像永远复习不完。实际面下来会发现:高频题就那些类型,换公司、换岗级,只是在深度和场景上略有差别。
难点通常不在「有没有见过」,而在三件事:
- 基础是否扎实,能不能讲清楚原理而不是背定义
- 能不能把语言和项目经验连起来(为什么用
shared_ptr、为什么这里不用异常) - 手写/口述代码时思路是否清晰,边界条件会不会漏
所以复习不必贪多求全,按模块过一遍经典题 + 自己讲一遍,性价比最高。
准备策略
1. 先划模块,再刷题
建议顺序:语言基础 → 面向对象 → 内存与智能指针 → STL → 并发与 C++11/14/17 → 杂项(关键字、UB、工程实践)。每个模块挑代表题吃透,比漫无目的刷几百道更有效。
2. 每道题至少能答三层
- 是什么(结论)
- 为什么(原理、标准规定)
- 怎么用 / 坑在哪(项目里怎么选)
3. 手写代码要练
vector 扩容思路、单例写法、shared_ptr 控制块、移动构造、生产者消费者——面试常让写骨架或口述实现,只背概念不够。
4. 结合简历项目
每道常考题准备一句「我在 XX 里怎么用的 / 为什么不用 YY」,面试官会明显觉得你是真写过 C++ 的。
5. 时间分配参考(约 2~3 周业余)
- 第 1 周:基础 + OOP + 内存(占 40%)
- 第 2 周:STL + 现代 C++ 特性(占 35%)
- 第 3 周:并发 + 模拟面试 + 错题回顾(占 25%)
核心大厂开发面试题以及基础八股文资料汇总:
https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW
高频面试题
语言基础
- C 和 C++ 的主要区别有哪些?
struct和class在 C++ 里有什么区别?const关键字有哪些常见用法?static关键字在全局变量、局部变量、类成员、类函数上分别什么含义?#define和const、enum、inline相比各有什么优劣?- 指针和引用的区别?什么场景必须用引用/指针?
- 函数指针和
std::function的区别? - 左值、右值、左值引用、右值引用分别是什么?
- 什么是移动语义?
std::move做了什么? - 深拷贝和浅拷贝的区别?什么时候必须自定义拷贝构造/赋值?
面向对象
- 面向对象的三大/四大特性是什么?
- 构造函数、析构函数、拷贝构造、拷贝赋值的调用顺序?
- 什么是虚函数?虚函数表(vtable)大致怎么工作?
- 纯虚函数和抽象类是什么?
- 虚析构函数为什么重要?
- 重载、重写(覆盖)、隐藏的区别?
- 公有继承、保护继承、私有继承在访问权限上有什么不同?
- 多继承有什么问题?菱形继承和虚继承了解吗?
- 运算符重载有哪些限制和注意事项?
explicit关键字解决什么问题?
内存与资源管理
- 堆和栈的区别?哪些对象在栈上、哪些在堆上?
new/delete与malloc/free的区别?- 什么是内存泄漏?常见原因有哪些?
- 野指针、悬空指针分别是什么?
- RAII 是什么?在 C++ 里怎么体现?
- 智能指针
unique_ptr、shared_ptr、weak_ptr的区别和使用场景? shared_ptr线程安全吗?引用计数如何理解?- 为什么要用
make_shared/make_unique? - 自定义
deleter用在什么场景? - 什么是 Rule of Three / Rule of Five?
STL 与算法
- STL 六大组件(或常见容器)有哪些?
vector底层实现?扩容策略和复杂度?vector中push_back和emplace_back的区别?list和vector怎么选?map和unordered_map底层与复杂度、使用场景?set里元素能不能修改?为什么?- 迭代器失效是什么?哪些操作会导致失效?
- 函数对象(仿函数)和
lambda的捕获方式有哪些? std::sort用什么算法?自定义比较要注意什么?- 容器遍历中删除元素的正确做法?
并发与现代 C++
- 进程和线程的区别?
- 线程同步有哪些方式(互斥锁、条件变量等)?
mutex、lock_guard、unique_lock的区别?- 什么是死锁?如何避免?
atomic解决什么问题?能保证什么、不能保证什么?thread创建线程时要注意什么(传参、join/detach)?volatile和原子操作、内存序的关系?(常考误区)- C++11 里
nullptr为什么比NULL好? - 范围 for 循环底层大致怎么用迭代器实现?
auto、decltype分别用在什么场景?
结尾
这 50 道题覆盖了大部分 C++ 初~中级面试的主干。不必每道都背标准答案,能用自己的话讲清、能举项目例子、能手写关键代码,比刷题量更重要。