C++ 面试到底考什么,整理完你就懂了

刷了很多面经之后发现,C++ 面试的考察点其实很集中,不是漫无边际的,把这几个方向吃透,大部分面试都能应对。

一、内存管理

这是 C++ 面试出现频率最高的方向,几乎每场必问。

核心考点:

  • new/deletemalloc/free 的区别,能不能混用
  • 栈、堆、全局区、代码段各存什么,生命周期是什么
  • 内存泄漏的原因和排查方式
  • 智能指针三兄弟,unique_ptrshared_ptrweak_ptr 的区别和使用场景
  • shared_ptr 的引用计数实现原理,循环引用怎么产生怎么解决
  • placement new 是什么,什么时候用

面试官真正想考的不是你背没背过这些概念,而是你有没有在实际项目里踩过坑,能不能说出来为什么这么设计。

二、面向对象

C++ 的 OOP 特性是必考内容,但考法越来越偏向原理而不是概念。

核心考点:

  • 虚函数表的结构,虚指针在对象内存里的位置
  • 多继承时虚函数表怎么组织,菱形继承的问题和虚继承的解决方式
  • 纯虚函数和抽象类,接口的设计
  • 构造函数和析构函数的调用顺序,虚析构函数不加会有什么问题
  • 对象切片问题,什么时候会发生
  • overridefinal 关键字的作用

重点是虚函数表,这个考得很深,要能说清楚多继承时的内存布局。

C++面试常考题目类型都放入了专栏了:https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW

三、C++11 及之后的新特性

这块是近几年面试的高频区,说明你有没有跟上现代 C++ 的节奏。

核心考点:

  • 移动语义和右值引用,std::move 做了什么,移动后原对象是什么状态
  • 万能引用和完美转发,std::forward 解决了什么问题
  • lambda 表达式的捕获方式,值捕获和引用捕获的区别
  • autodecltype 的类型推导规则
  • constexpr 和编译期计算
  • std::optionalstd::variantstd::any 的使用场景
  • 范围 for 循环的底层实现

移动语义是这块的重中之重,要能结合 vector 扩容、函数返回值等场景来解释。

四、模板和泛型编程

中大厂面试越来越喜欢考这块,因为能体现你对 C++ 的理解深度。

核心考点:

  • 函数模板和类模板的基本用法
  • 模板特化和偏特化的区别,什么时候用
  • SFINAE 是什么,std::enable_if 怎么用
  • 模板的实例化时机,为什么模板定义要放在头文件里
  • 可变参数模板,sizeof... 运算符
  • CRTP(奇异递归模板模式)是什么,解决了什么问题
  • C++20 的 Concepts 了解吗

这块不需要全部精通,但至少要能说清楚 SFINAE 和模板特化,这是高频考点。

五、并发编程

多线程是 C++ 面试的必考方向,而且越来越深。

核心考点:

  • std::thread 的基本用法,线程的生命周期管理
  • std::mutexstd::shared_mutexstd::recursive_mutex 的区别
  • std::lock_guardstd::unique_lock 的区别,什么时候用哪个
  • 条件变量 std::condition_variable 的使用,为什么要用 while 而不是 if
  • std::atomic 的内存序,六种内存序分别是什么含义
  • volatilestd::atomic 的区别,volatile 能保证线程安全吗
  • 死锁的产生条件和避免方法
  • 优先级反转是什么,怎么解决
  • 无锁编程,CAS 操作,ABA 问题

内存序是这块的难点,很多人说不清楚 acquire/release 的含义,能说清楚这个很加分。

六、STL 容器

这块考察频率很高,但深度要求也在提升,不能只会用。

核心考点:

  • vector 的底层实现,扩容机制,扩容后迭代器为什么失效
  • vectorlist 的区别,各自适合什么场景
  • mapunordered_map 的底层结构,时间复杂度,什么时候用哪个
  • unordered_map 的哈希冲突怎么解决,负载因子是什么
  • deque 的底层结构,为什么 stackqueue 默认用 deque
  • 迭代器失效的场景,各个容器分别是什么情况
  • std::string 的 SSO(小字符串优化)了解吗

重点是 vectorunordered_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 容器 > 新特性 > 模板 > 编译链接 > 设计模式 > 性能优化

前四个是基础,每场必考,要非常熟练。后面几个是加分项,能说清楚就比大多数人强。

最重要的一点:每个知识点都要能结合实际场景来说,光背概念没用,面试官一追问就露馅了。

全部评论

相关推荐

03-19 09:58
河海大学 Java
最喜欢春天的奇亚籽很...:同学,是小红书不是小哄书,一眼就能看到的错误
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务