为什么要专门分享 C++后端 面试题?
后端同学准备面试时,Java 岗位的题库一搜一大把,C++ 后端的面试内容却又散又乱,很难系统整合。
所以我整理了一份一线互联网大厂的高频 C++ 后端面试题,直接帮大家省时间。
这份面试题专为 C++ 后端岗位整理,覆盖 8 大核心领域,共计 200 道题,方便你针对性复习。
建议直接收藏,需要时可随时调取查看。
- C/C++基础(36道):语言特性、内存管理、STL实现、面向对象等
- 设计模式(14道):创建型、结构型、行为型模式及应用
- 数据结构与算法(35道):栈、队列、链表、二叉树、动态规划等
- 操作系统(17道):进程线程、内存管理、系统调用等
- 数据库(32道):MySQL、Redis原理及优化
- 网络(15道):TCP/IP、网络编程、IO模型等
- 分布式与集群(44道):CAP理论、Kafka、gRPC、etcd、Docker等
- 设计方案(7道):海量数据处理、系统设计等
如果你需要大厂Linux C/C++面试题pdf文档(含解析),可以点击关注来拿一份
Part1C/C++(36 道)
这部分是 C++ 后端的 “敲门砖”,面试官常从语法细节、标准库原理和面向对象设计切入,考察基础是否扎实。
1.1、语言
- static 和 const 在 C/C++ 里分别有哪些作用?实际项目中怎么用?
- 引用和指针都能间接访问变量,它们的区别在哪?各自适用什么场景?
- 野指针很容易导致崩溃,平时写代码时怎么避免出现野指针?
- malloc/free 和 new/delete 不是一回事吧?它们的核心区别是什么?如果 malloc 申请空间失败了该怎么处理?
- extern 关键字有什么用?比如在多文件编译时怎么用它?
- strcpy、sprintf 和 memcpy 都能处理数据拷贝,什么时候用哪个?它们的风险点(比如越界)怎么规避?
- C++ 里的强制类型转换有几种?static_cast、dynamic_cast 这些分别用在什么场景?
- 类什么时候会自动生成默认构造函数?如果自己写了构造函数,默认的还会有吗?
- 默认拷贝构造函数是在什么情况下生成的?它做的是深拷贝还是浅拷贝?
- 深拷贝和浅拷贝的区别是什么?什么时候必须自己写深拷贝构造函数?不写会有什么问题?
1.2、标准库
- 面试官常问:vector 的底层是怎么实现的?核心逻辑是什么?
- vector 存数据时,内存不够了会怎么增长?不同编译器下增长策略有区别吗?
- 用 vector 时,reserve 和 resize 经常搞混,它们的区别到底是什么?
- 为什么 vector 的元素类型不能是引用?换成指针行不行?
- list 的底层是链表吧?它的插入、删除效率为什么比 vector 高?
- deque 看起来既能像 vector 随机访问,又能像 list 高效头尾操作,它底层是怎么实现的?
- 实际项目里,什么时候该用 vector、什么时候用 list、什么时候用 deque?得结合场景说。
- priority_queue 是 “优先队列”,底层用什么数据结构实现的?怎么自定义优先级?
- map、set 这些关联容器,底层都是红黑树吗?红黑树的核心特性是什么,为什么选它?
- unordered_map 和 unordered_set 是哈希表实现的吧?哈希冲突怎么解决?负载因子是什么?
- 迭代器到底是什么?它有哪几种类型?比如输入迭代器、双向迭代器的区别?
- 迭代器失效是个大坑,连续存储容器(比如 vector)和非连续存储容器(比如 list)的失效场景分别是什么?怎么处理?
- STL 容器是线程安全的吗?多线程下用 vector 怎么保证安全?
1.3、面向对象
- 面向对象的三大特征是封装、继承、多态,能分别说说它们的作用吗?
- C++ 的多态是怎么实现的?虚函数表和虚指针在其中起了什么作用?
- 菱形继承(多继承时父类重复)会导致二义性,怎么解决这个问题?
- 函数重载和函数重写经常被问,它们的区别是什么?分别在什么场景用?
- 运行期多态的实现原理是什么?编译期多态呢(比如模板)?
- 调用虚函数时,程序是怎么找到具体要执行的函数的?过程是什么样的?
- 子类继承父类后,构造函数和析构函数的执行顺序是怎样的?析构函数为什么要设为虚函数?
- 类的虚函数表和虚指针(vptr)是在什么时候创建的?存在内存的哪个区域?
- 智能指针有哪些种类?shared_ptr、unique_ptr、weak_ptr 分别用在什么场景?怎么避免循环引用?
- 你用过 C++11 的哪些新特性?比如 lambda 表达式、右值引用这些,实际项目中怎么用的?
- 动态库和静态库的区别是什么?编译、链接、运行时的表现有什么不同?
- 左值引用和右值引用的区别是什么?右值引用为什么能提高效率?移动语义是怎么回事?
Part2设计模式(14 道)
这部分考察 “代码设计能力”,面试官会问设计原则、常用模式的场景,重点看你能不能把模式落地到实际开发。
2.1、设计原则:考察基础设计思想
- 面向对象设计有哪些核心原则?比如开闭原则、单一职责原则这些。
- 开闭原则是 “对扩展开放、对修改关闭”,哪些设计原则和它相关?比如里氏替换原则和它的关系是什么?
- 里氏替换原则说的是什么?如果不遵守,代码会有什么问题?
- 迪米特原则(最少知道原则)的核心是什么?实际写代码时怎么体现?
- 依赖倒置原则是 “依赖抽象不依赖具体”,怎么做到?比如用接口还是用基类?
2.2、创建型模式:考察对象创建方式
- 单例模式在多线程下会有线程安全问题吗?怎么实现一个线程安全的单例?
- 工厂模式和抽象工厂模式有什么区别?比如造 “手机”,什么时候用工厂,什么时候用抽象工厂?
2.3、结构型模式:考察类与对象的组合
- 代理模式是 “替别人做事”,实际场景比如什么?比如远程代理、保护代理的例子。
- 装饰器模式能动态给对象加功能,它和继承的区别是什么?比如给 “咖啡” 加奶泡,用装饰器怎么实现?
- 组合模式是处理 “整体 - 部分” 关系的,比如文件系统里的文件夹和文件,怎么用组合模式设计?
- 责任链模式是 “链式处理请求”,比如审批流程,怎么用这个模式实现?
2.4、行为型模式:考察对象间的通信
- 模板方法模式是 “父类定流程,子类填细节”,比如做蛋糕的流程,能举个例子吗?
- 策略模式是 “替换算法”,比如排序算法,怎么用策略模式让用户选不同的排序方式?
- 观察者模式是 “发布 - 订阅”,比如公众号和粉丝,它的核心角色有哪些?怎么实现?
Part3数据结构与算法(35 道)
这部分是 “硬通货”,大厂必考,重点看你能不能用基础数据结构解决实际问题,算法题要能说清思路。
3.1、栈与队列:考察基础数据结构操作
- 用两个栈怎么实现一个队列?入队和出队的逻辑分别是什么?
- 怎么实现一个包含 min 函数的栈,而且 min 的时间复杂度是 O (1)?
- 队列的最大值怎么求?比如随时能返回当前队列里最大的元素。
- 给一个栈,怎么用另一个栈实现它的排序?比如把栈里的元素从小到大排。
- 只能用递归函数和栈操作,怎么把一个栈里的元素逆序?比如原来 1、2、3,逆序后 3、2、1。
3.2、链表:考察链表操作与边界处理
- 怎么找链表中倒数第 k 个节点?比如链表长度不确定,能不能只遍历一次?
- 链表有环吗?如果有,怎么找到环的入口节点?
- 反转链表的思路是什么?迭代和递归两种方式都能写吗?
- 从尾到头打印链表,不能改变链表结构,怎么实现?
- 两个链表可能有公共节点(比如 Y 型结构),怎么找第一个公共节点?
3.3、字符串:考察字符串处理与逻辑
- 字符串里第一个只出现一次的字符怎么找?比如 “abaccdeff” 里的 'b'。
- 最长不含重复字符的子字符串长度是多少?比如 “abcabcbb” 的最长是 3。
- 字符串的全排列怎么求?比如 “abc” 的所有排列组合。
- 怎么反转字符串?比如 “hello” 变成 “olleh”,如果是反转单词(“the sky is blue”→“blue is sky the”)呢?
- 把数字翻译成字符串,比如 12 可以译成 “ab” 或 “l”,有多少种翻译方式?
3.4、二叉树:考察树的遍历与结构理解
- 给前序和中序遍历结果,怎么重建二叉树?比如前序 [1,2,4,7,3,5,6,8]、中序 [4,7,2,1,5,3,8,6]。
- 给定二叉树的一个节点,怎么找它的下一个节点(中序遍历的下一个)?
- 怎么判断一棵树是不是另一棵树的子结构?比如树 A 的结构和值都包含在树 B 里。
- 二叉树的镜像怎么求?比如把每个节点的左右子树交换。
- 怎么判断一棵二叉树是不是对称的?比如根节点的左子树和右子树镜像对称。
- 从上到下打印二叉树,是层序遍历吧?如果要求每一层打印一行呢?
- 二叉树怎么序列化和反序列化?比如把树转成字符串,再从字符串恢复成树。
- 二叉树的深度怎么求?递归和迭代方式都可以吗?
- 二叉树的第 k 大节点怎么找?比如二叉搜索树的第 k 大。
- 树中两个节点的最低公共祖先(LCA)是谁?比如普通二叉树和二叉搜索树的找法有区别吗?
3.5、动态规划与贪心:考察算法思维
- 剪绳子问题:把长度为 n 的绳子剪成 m 段,每段长度乘积最大是多少?
- 怎么统计一个整数的二进制表示中 1 的个数?比如 6(110)有 2 个 1。
- 矩阵的最小路径和:从左上角到右下角,只能右或下走,路径和最小是多少?
- 换钱的方法数:给定金额和硬币面额,有多少种凑钱方式?
- 换钱的最少货币数:同样凑金额,最少需要几枚硬币?
- 最长公共子序列(LCS)怎么求?比如 “abcde” 和 “ace” 的 LCS 是 3。
- 最长公共子串怎么求?和子序列有什么区别?
- 数组中的最长连续序列:比如 [100,4,200,1,3,2] 的最长是 4(1,2,3,4)。
- 最长递增子序列(LIS):比如 [10,9,2,5,3,7,101,18] 的 LIS 是 4。
- 最小编辑代价:把字符串 A 改成字符串 B,插入、删除、替换的代价分别是 a、b、c,最小代价是多少?
Part4操作系统(17 道)
这部分考察 “底层基础”,大厂尤其看重,会问进程线程、内存管理的核心逻辑,看你能不能理解系统运行机制。
4.1、进程与线程:考察调度与通信
- 进程和线程的核心区别是什么?比如资源占用、切换开销这些。
- 操作系统里,进程切换和线程切换的过程分别是什么?哪个更快?
- 能说说系统调用的完整过程吗?比如从用户态到内核态的切换。
- 后台进程(守护进程)有什么特点?如果让你写一个守护进程,需要做哪些步骤(比如脱离终端)?
- 进程间通信(IPC)有哪些方式?管道、消息队列、共享内存这些,分别用在什么场景?
- 操作系统的进程调度策略有哪些?比如先来先服务、短作业优先、时间片轮转。
- 线程同步的方式有哪些?互斥锁、信号量、条件变量的区别是什么?
- CAS 是 “比较并交换”,它是怎么实现线程同步的?有什么缺点(比如 ABA 问题)?
- CPU 执行指令的流程是什么?取指、译码、执行这些步骤,怎么和内存交互?
4.2、内存管理:考察地址与分配
- 用户态和核心态的区别是什么?为什么要有这两个状态?怎么切换?
- 操作系统的内存管理有哪几种方式?比如分区管理、分页管理、分段管理。
- 分页和分段的区别是什么?比如分页是 “固定大小”,分段是 “按逻辑”。
- 页面置换算法有哪些?比如 LRU、FIFO、Clock 算法,各自的优缺点?
- 虚拟内存是什么?它解决了什么问题(比如内存不够用)?
- 为什么虚拟地址空间切换会耗时?比如页表切换、TLB 失效的影响。
- 虚拟内存和物理内存是怎么对应的?页表在其中起了什么作用?
- 请求页面置换策略有哪些?比如预调页和请求调页的区别,它们用什么算法解决缺页问题?
Part5数据库(32 道)
这部分是 “后端必备”,MySQL 和 Redis 是重点,考察索引、事务、缓存问题,看你能不能应对实际业务中的数据存储需求。
5.1、MySQL:考察底层与优化
- 数据库的三大范式是什么?实际设计表的时候,一定要遵守吗?
- 线上 MySQL 的 CPU 突然飙升,怎么定位问题?比如先看慢查询日志。
- 怎么定位并优化慢 SQL?比如用 explain 看执行计划,索引怎么加?
- 视图是什么?为什么要用视图?它的优缺点是什么?
- 一条 SQL 语句从发出去到执行完成,MySQL 内部的流程是什么?比如连接器、分析器、优化器。
- 索引在哪些情况下会失效?比如用了函数、不等于、左模糊匹配。
- 建索引的目的是什么?但建索引也有代价,代价是什么(比如写操作变慢)?
- 主键索引和唯一索引的区别是什么?它们的存储结构有差异吗?
- 聚集索引和非聚集索引的区别是什么?InnoDB 里的主键索引是哪种?
- 覆盖索引是什么意思?比如查询 “select id,name from user where age=20”,怎么建覆盖索引?
- 回表查询是什么?什么时候会发生?怎么避免?
- 索引的最左匹配规则是什么?比如联合索引(a,b,c),查 b 和 c 为什么走不了索引?
- 索引下推(ICP)是什么原理?它能提高查询效率吗?为什么?
- InnoDB 和 MyISAM 的区别是什么?比如事务支持、锁粒度、存储结构。
- 索引为什么要用 B + 树,而不是二叉树或 B 树?从查询效率、磁盘 IO 角度说。
- 数据库事务的 ACID 特性分别是什么?能解释下每个特性的含义吗?
- 脏读、幻读、不可重复读分别是什么意思?怎么产生的?用什么隔离级别能解决?
- 不可重复读和幻读经常分不清,它们的区别是什么?
- SQL 注入是什么原理?比如输入 “' or 1=1 #”,怎么避免(比如预编译)?
- MySQL 死锁怎么产生的?比如两个事务互相等对方的锁,怎么排查和解决?
- MVCC 是 InnoDB 实现隔离级别的核心,它的底层原理是什么? undo 日志、Read View 起了什么作用?
5.2、Redis:考察缓存与高可用
- Redis 是什么?它的应用场景有哪些?比如缓存、分布式锁、计数器。
- Redis 支持哪些数据类型?string、hash、zset 这些,它们的底层实现分别用了什么数据结构?
- 同样数量的数据,用 hash 存储和用 zset 存储,哪个占空间更少?为什么?
- 基于 Redis 怎么实现限流?比如计数器法、滑动窗口法、令牌桶法。
- Redis 为什么是单线程的?这里说的 “单线程” 指的是哪个线程?它为什么这么快?
- 用 Redis 实现分布式锁的步骤是什么?有什么缺陷(比如死锁、误删)?怎么解决?
- Redis 怎么做到高可用?主从复制、哨兵、集群这三种方案的区别是什么?
- Redis 的持久化机制有哪些?RDB 和 AOF 的优缺点分别是什么?怎么选?
- 缓存雪崩、缓存穿透、缓存击穿分别是什么问题?怎么解决?比如雪崩用熔断,穿透用布隆过滤器。
- Redis 的内存淘汰策略有哪些?比如 volatile-lru、allkeys-lfu,什么时候用哪个?
- Redis 的事务和 MySQL 的事务不一样吧?它的 “事务” 是怎么实现的?能保证原子性吗?
Part6网络(15 道)
这部分考察 “通信基础”,后端天天和网络打交道,会问 IO 模型、TCP 原理,看你能不能写出高效的网络程序。
6.1、网络编程:考察模型与实践
- Reactor 网络编程模型是什么?比如主从 Reactor、单 Reactor 多线程的区别?
- Reactor 和 Proactor 模型的核心区别是什么?分别适合什么场景?
- 网络编程中,怎么判定一个连接已经断开了?比如心跳包、读事件返回 0。
- 服务器接收客户端连接有几种方式?比如阻塞 accept 和非阻塞 accept。
- 为什么用户态程序要自己设置读写缓冲区?内核不是有缓冲区吗?
6.2、网络原理:考察 TCP/IP 与 IO
- IO 多路复用里的水平触发(LT)和边缘触发(ET)有什么区别?如果 ET 模式下,socket 读了 200 字节就不处理了,剩下的 300 字节还能读到吗?
- 查看网络状态时,CLOSE_WAIT 和 TIME_WAIT 这两个状态是什么意思?怎么排查这两种状态过多的问题?它们存在的意义是什么?
- TCP 三次握手的过程能说说吗?为什么不能是两次握手?会有什么问题(比如失效的连接请求)?
- TCP 四次挥手的过程是什么?TIME_WAIT 状态为什么要等 2MSL 时间?
- 连接的半打开和半关闭状态分别是什么意思?怎么产生的?
- Linux 下的 IO 模型有哪几种?阻塞 IO、非阻塞 IO、IO 多路复用这些的区别?
- 阻塞 IO 和非阻塞 IO 的核心区别是什么?非阻塞 IO 是不是就比阻塞 IO 好?
- select、poll、epoll 这三个 IO 多路复用函数的区别是什么?比如文件描述符上限、效率。
- 为什么边缘触发(ET)一定要搭配非阻塞 IO 使用?用阻塞 IO 会有什么问题?
- 能详细说说 IO 多路复用的机制吗?比如 epoll 是怎么实现 “监听多个 fd” 的?
Part7分布式与集群(44 道)
这部分是 “大厂加分项”,考察分布式理论与中间件实践,看你能不能应对大规模系统的设计与问题。
7.1、分布式理论:考察一致性与协议
- CAP 理论说的是一致性、可用性、分区容错性,三者为什么不能同时满足?实际系统怎么选?
- Base 理论是对 CAP 的补充吧?它的核心思想是什么(比如最终一致性)?
- 2PC(两阶段提交)协议是什么?它有什么缺点(比如阻塞问题)?
- Raft 协议是用来解决什么问题的? Leader 选举、日志复制的过程是什么?
7.2、Kafka:考察消息队列实践
- Kafka 是什么?它主要解决了什么问题(比如高吞吐、解耦)?
- Zookeeper 在 Kafka 集群里起了什么作用?比如存储元数据、选 Controller。
- Kafka 怎么判断一个 broker 节点是否还活着?是靠心跳吗?
- Kafka 的 ack 参数有 0、1、-1(all)三种,分别代表什么意思?怎么选?
- 消费者怎么控制自己的消费位置(offset)?比如从头消费、从最新消费。
- 分布式场景下,Kafka 怎么保证消息的顺序消费?比如分区内有序、全局有序的实现。
- Kafka 的高可用机制是什么?比如副本机制、ISR 列表。
- 怎么减少 Kafka 的消息丢失?比如生产者、broker、消费者各自要做什么配置。
- 怎么避免 Kafka 消费重复消息?比如消费端的幂等处理。
- Kafka 是怎么维护消费者的消费状态的?比如消费者组、offset 存储。
7.3、gRPC:考察 RPC 框架应用
- gRPC 服务端的启动流程是什么?比如定义 proto、生成代码、注册服务。
- gRPC 支持哪些服务类型?比如 Unary、Server Streaming、Client Streaming。
- 一个 gRPC 连接(connection)能处理多个流(stream),那 keepalive 机制是针对 stream 还是 connection 的?
- gRPC 里的 “多路复用” 指的是什么?和 HTTP/2 的多路复用有关系吗?
- 怎么自定义 gRPC 的 resolver?比如实现服务发现。
- 怎么自定义 gRPC 的负载均衡(balance)策略?比如轮询、随机。
- 怎么实现 gRPC 的全链路追踪?比如用 opentracing 埋点。
- gRPC 客户端的 connection 有哪些连接状态?比如 IDLE、CONNECTING、READY。
- 客户端怎么获取服务端提供的服务函数列表?
- gRPC 怎么给每个 stream 做限流?flow control(流量控制)是什么意思?
7.4、etcd:考察分布式存储
- etcd 里的 “任期(term)” 是什么意思?和 Leader 选举有什么关系?
- etcd 的 Raft 状态机有哪些状态(比如 Follower、Candidate、Leader)?怎么切换的?
- 怎么防止 etcd 的 Candidate 节点在遗漏部分日志的情况下当选 Leader?
- etcd 集群里某个节点宕机了,集群会怎么处理?比如重新选举、数据同步。
- 为什么 Raft 算法不考虑拜占庭将军问题?etcd 是怎么保证数据一致性的?
- etcd 的 Leader 节点是怎么选举出来的?需要满足什么条件?
- etcd 是怎么保证集群数据一致性的?比如日志复制、多数派确认。
7.5、Docker/K8s:考察容器与编排
- Docker 镜像是什么?它和容器的关系是什么?比如镜像就是 “模板”。
- Docker 容器是什么?它和虚拟机的区别是什么?比如资源占用、启动速度。
- Docker 容器有哪几种状态?比如 created、running、exited、paused。
- Dockerfile 里的 COPY 和 ADD 命令都能复制文件,它们的区别是什么?ADD 能解压压缩包吗?
- 容器和主机之间怎么拷贝数据?比如 docker cp 命令的用法。
- Dockerfile 里的 ONBUILD 指令是什么意思?它什么时候执行?
- 生产环境中怎么监控 Docker 容器?比如用 prometheus+grafana。
- 构建 Docker 镜像有哪些最佳实践?比如减少层数、用多阶段构建。
- 容器退出后,用 docker ps 看不到了,容器里的数据会丢失吗?怎么持久化数据?
7.6、数据库集群:考察高可用与扩展
- MySQL 主从复制的原理是什么?比如 binlog 日志、IO 线程、SQL 线程。
- MySQL 分库分表是怎么回事?什么时候需要做?水平分表和垂直分表的区别?
- Redis 的高可用方案有哪些?主从复制、哨兵、集群的区别是什么?
- Redis Cluster 集群的原理是什么?比如哈希槽、主从复制、故障转移。
Part8设计方案(7 道)
这部分考察 “系统设计能力”,大厂终面常问,看你能不能用技术解决海量数据、复杂场景的问题。
8.1、发散题:考察海量数据处理
- 有 20 亿个整数,内存只有 2GB,怎么找到出现次数最多的那个数?
- 100 亿个 URL,怎么找出其中重复的 URL?还有怎么求搜索词汇的 Top K?
- 40 亿个非负整数,怎么找到其中没出现过的数?内存不够用怎么处理?
- 同样 40 亿个非负整数,怎么找到出现了两次的数?还有怎么求所有数的中位数?
- 岛问题:一个二维数组里,1 代表陆地、0 代表水,相邻的 1 算一个岛,怎么统计岛的数量?
8.2、综合题:考察实际系统设计
- 怎么保证 Redis 和 MySQL 的缓存一致性?比如更新策略(先更 DB 还是先更缓存)。
- 设计一个海量定时器系统,时间跨度从毫秒级到年,怎么保证高效触发?
成功拿下offer不仅需要掌握题库,更需扎实的技术功底。如需C++后端技术学习路线,可参考我们此前整理的进阶路线指南☞【大厂标准】Linux C/C++ 后端进阶学习路线→「链接」。
如果你需要最新大厂Linux C/C++面试题pdf文档(含解析),可以点击「链接」来拿一份↓↓
往期文章推荐
为什么很多人劝退学 C++,但大厂核心岗位还是要 C++?
【大厂标准】Linux C/C++ 后端进阶学习路线
音视频流媒体高级开发-学习路线
C++ Qt学习路线一条龙!(桌面开发&嵌入式开发)
Linux内核学习指南,硬核修炼手册
C/C++ 高频八股文面试题1000题(三)
手撕线程池:C++程序员的能力试金石