C++暑期实习八股文准备
暑期实习的 C++ 面试,很多同学最大的感受不是“不会”,而是“知道一点,但说不顺”。所以准备八股文,重点不是把每个知识点背成定义,而是把常见问题练成一套能稳定输出的回答。面试官通常不会要求你像教材一样精确复述,但会很在意你是否理解概念、能不能举例、能不能说出实际使用场景。
这篇文章就按“实习面试最常问、最值得优先准备”的思路来梳理。你不需要一开始就追求全覆盖,先把高频内容吃透,再慢慢扩展,效果会好很多。
一、先搞清楚:C++暑期实习主要考什么
C++ 实习面试通常不是单独考语言本身,而是几块内容混在一起问:
- C++ 语言基础
- 面向对象
- 内存管理
- STL 和常用容器
- 智能指针
- 多态、虚函数、继承
- 右值引用、移动语义
- 线程、锁、并发基础
- 计算机基础,比如操作系统、网络、数据结构
- 项目拷打
如果你目标是暑期实习,那么优先级一般是:
- 第一优先:C++ 基础、STL、内存管理、面向对象
- 第二优先:智能指针、移动语义、多线程基础
- 第三优先:模板、设计模式、深入源码、复杂并发细节
也就是说,别一上来就扎进模板元编程。对实习岗来说,先把高频题答顺,比追求冷门深度更重要。
核心大厂开发面试题以及基础八股文资料汇总:
https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW
二、C++基础题一定要准备到“能说顺”
1. 指针和引用的区别
这是经典高频题,几乎必问。
可以这样答:
- 指针本质上是一个变量,存的是地址
- 引用可以理解为变量的别名
- 指针可以为空,可以修改指向
- 引用定义时必须初始化,正常情况下不能再改绑到别的对象
如果面试官继续追问,可以补充:
sizeof(指针)是固定大小,和平台有关- 引用在语法上更安全,使用时像普通变量
- 指针更灵活,适合动态内存、链表、接口传递等场景
这类题的关键,不是背“引用底层也是指针实现”这种话,而是要能说出“语义区别”和“使用场景”。
2. const 的作用
这个也很爱问。
你可以从几个角度说:
- 修饰变量,表示不可修改
- 修饰指针,有“指向常量的指针”和“常量指针”两种
- 修饰成员函数,表示不修改对象状态
- 提高代码可读性和安全性
常见追问:
const int *pint * const pconst int * const p
这三个一定要分清。
3. static 的作用
static 也是基础高频题。
分场景回答最稳:
- 修饰局部变量:生命周期变成整个程序运行期,但作用域仍在函数内
- 修饰全局变量:限制作用域在当前文件
- 修饰类成员变量:属于类,不属于某个对象
- 修饰类成员函数:没有
this指针,只能访问静态成员
面试时最怕的不是不会,而是把不同场景混着说。
4. 宏和 inline 的区别
这个题的本质是“预处理替换”和“真正函数”的区别。
回答重点:
- 宏是预处理阶段直接替换,没有类型检查
inline是编译器层面的建议,有类型检查- 宏可能带来副作用,调试也不友好
inline更安全,通常更推荐使用
比如:
#define SQUARE(x) x*x
传入 a+b 就可能出错,这种例子最好会举。
三、面向对象部分是必考区
1. 封装、继承、多态怎么理解
这题经常是开场送分题。
- 封装:把数据和操作数据的方法放在一起,并控制访问权限
- 继承:子类复用父类已有能力
- 多态:同一个接口,不同对象表现不同
不要只背概念,最好加一句:
“在实际项目里,多态常用于统一接口,比如不同模块实现同一套抽象基类。”
这样回答会更像真正理解。
2. 重载、重写、隐藏的区别
这个很容易混。
- 重载:同一作用域内函数名相同,参数列表不同
- 重写:子类重定义父类的虚函数,函数签名要匹配
- 隐藏:子类定义了和父类同名函数,不管参数是否相同,父类同名函数都可能被隐藏
面试官很喜欢通过这个题看你是否真的分得清 C++ 的函数机制。
3. 虚函数的作用
核心就一句:
“通过基类指针或引用调用函数时,能在运行时决定真正调用哪个子类实现,这就是运行时多态。”
再往下补:
- 虚函数依赖虚函数表
- 有虚函数的类通常会有虚表指针
- 析构函数常常要写成虚析构,避免基类指针删除子类对象时资源泄漏
4. 为什么析构函数要是虚函数
高频中的高频。
标准回答:
如果一个类会被当作基类使用,并且可能通过基类指针删除子类对象,那么析构函数必须是虚函数。否则只会调用基类析构函数,子类资源无法正确释放,造成资源泄漏。
这个问题基本是白给分,必须拿下。
四、内存管理是 C++ 面试核心
1. 栈和堆的区别
建议从这几个角度答:
- 栈由系统自动分配和回收,堆由程序员手动管理或借助智能指针管理
- 栈上的对象生命周期通常随作用域结束
- 堆适合动态分配、大对象、需要跨作用域存活的数据
- 栈分配释放快,堆更灵活但管理成本更高
2. new/delete 和 malloc/free 的区别
这是经典题。
重点:
malloc/free是 C 风格,只有内存分配和释放,不会调用构造析构new/delete是 C++ 运算符,会调用构造和析构new返回指定类型指针,不需要强转malloc返回void*
继续追问时,可以补充:
new失败默认抛异常malloc失败返回NULL
3. 内存泄漏是什么,怎么避免
回答结构可以很清晰:
- 动态申请的内存没有释放,且程序再也无法访问到这块内存,就是内存泄漏
- 常见原因:忘记
delete、异常中断流程、指针覆盖、循环引用 - 避免方式:智能指针、RAII、规范资源管理
只要说到 RAII,通常印象就不错。
4. 什么是 RAII
RAII 是 C++ 非常重要的思想。
一句话理解:
“资源获取即初始化,资源对象的生命周期和资源绑定,对象析构时自动释放资源。”
资源不只是内存,还包括:
- 文件句柄
- 锁
- socket
- 数据库连接
面试时能把 RAII 和智能指针、锁结合起来说,会很加分。
五、STL 是实习面试最高频部分之一
1. vector 和 list 的区别
建议从底层结构和适用场景答:
vector底层是连续内存,支持随机访问list底层是双向链表,插入删除某个位置高效vector尾插通常高效,但扩容时可能搬迁list不支持随机访问,缓存命中率也通常不如vector
再补一句很实用的话:
“实际开发中 vector 的使用频率通常远高于 list。”
这句往往很真实。
2. vector 扩容机制
这是高频追问题。
答题要点:
vector有size和capacity- 当容量不足时,会申请更大的连续空间
- 再把原有元素搬过去
- 原来的空间释放
- 扩容会导致迭代器、指针、引用失效
至于扩容倍数,不同实现可能不同,不要答死。说“通常按倍数增长,由具体实现决定”更稳。
3. map 和 unordered_map 的区别
这个题经常考。
map底层通常是红黑树,有序unordered_map底层通常是哈希表,无序map查找插入删除复杂度通常是O(logn)unordered_map平均O(1),最坏可能退化
再补充:
- 需要有序遍历时用
map - 更关注查找性能时常用
unordered_map
4. set 和 unordered_set 也要会类比
这个和上面同理,面试官很喜欢连着问。
5. 迭代器失效
这是 STL 常见难点。
必须知道几个典型场景:
vector扩容会导致全部迭代器失效erase会使被删位置及后续迭代器失效list插入删除通常只影响当前被删除位置的迭代器- 不同容器规则不一样
如果你能说出“边遍历边删除要特别小心”,就已经很像写过代码的人了。
六、智能指针必须准备
1. C++ 常见智能指针有哪些
unique_ptrshared_ptrweak_ptr
这是必背,但别只背名字。
2. unique_ptr 和 shared_ptr 的区别
unique_ptr独占所有权,不能拷贝,只能移动shared_ptr共享所有权,通过引用计数管理资源
应用场景:
- 明确唯一所有者,用
unique_ptr - 需要多个对象共享资源,用
shared_ptr
3. 为什么需要 weak_ptr
这个问题很关键。
因为 shared_ptr 可能产生循环引用,导致引用计数无法归零,资源不能释放。weak_ptr 不增加引用计数,可以用来打破循环引用。
这个题你只要答顺了,智能指针部分就稳很多。
4. 智能指针是不是就完全没有问题
不能这么说。
还要知道:
shared_ptr有额外引用计数开销- 循环引用要小心
- 多线程下引用计数是线程安全的,但对象本身不一定线程安全
这类补充很加分。
七、右值引用和移动语义别怕,先拿基础分
1. 左值和右值是什么
简单讲:
- 左值:有名字、能取地址、可持续存在
- 右值:临时对象、表达式结果、生命周期较短
别把定义说太玄,实习面试先说清楚直观理解最重要。
2. 右值引用是什么
T&& 就是右值引用。
它的出现主要是为了:
- 绑定临时对象
- 实现移动语义
- 避免不必要的深拷贝
3. 什么是移动语义
移动语义的核心就是:
“资源所有权转移,而不是重新拷贝一份资源。”
比如一个对象内部有动态数组,如果拷贝就要重新申请和复制;如果移动,只需要把指针接过来,原对象置空即可,效率高很多。
4. std::move 做了什么
高频追问。
标准理解:
std::move 本身不移动,它只是把对象强制转换成右值引用,告诉编译器“这个对象的资源可以被移动走了”。
这句话很重要,很多人会误答成“std::move 会移动对象”。
八、多线程和并发基础要会说
暑期实习不一定问很深,但基础题越来越常见。
1. 进程和线程的区别
可以简洁答:
- 进程是资源分配的基本单位
- 线程是 CPU 调度的基本单位
- 一个进程可以有多个线程
- 同一进程内线程共享地址空间和大部分资源
2. 为什么线程不安全
因为多个线程同时访问共享资源时,如果没有同步机制,就可能出现竞态条件,导致结果不确定。
3. 互斥锁的作用
互斥锁用来保护临界区,保证同一时刻只有一个线程访问共享资源。
再顺手提一句:
“C++ 里常用 std::mutex,配合 std::lock_guard 或 std::unique_lock 管理锁,更符合 RAII 思想。”
这就把知识串起来了。
4. 死锁怎么产生
常见四个必要条件可以准备一下,但实习面试更常见的是让你口语化解释:
“两个线程互相等对方持有的锁,而且都不释放,就卡住了。”
避免方法:
- 固定加锁顺序
- 一次性申请所有锁
- 使用
std::lock - 减少锁嵌套
九、项目拷打时,八股文必须和项目结合
很多同学背八股背得不错,但项目一问就露馅。因为面试官真正想看的是:你是否把这些知识用过。
比如你写过服务端项目,面试官问:
vector用过吗,为什么不用listshared_ptr用在什么地方- 多线程里怎么保护共享队列
- 有内存泄漏风险吗
- 类为什么这样设计
所以准备八股时,最好每个知识点都顺手绑定一个项目场景。
例如:
- 智能指针:用于管理堆对象生命周期
- 互斥锁:保护任务队列
unordered_map:做高频查找- 虚函数:做统一模块接口
这样你答题时就不会很空。
十、暑期实习八股文怎么高效准备
最怕的准备方式是:今天看 50 道,明天忘 45 道。
更有效的方法是分三轮。
1. 第一轮:搭框架
先把高频知识点过一遍,知道有哪些模块:
- 基础语法
- 面向对象
- STL
- 内存管理
- 智能指针
- 并发基础
这一轮不追求背,只追求“知道在考什么”。
2. 第二轮:整理自己的口语答案
每个问题都整理成 3 到 5 句能说出来的话。
不是抄标准答案,而是写成你面试时真的会说的话。因为面试不是默写,是表达。
3. 第三轮:模拟追问
比如你准备了“shared_ptr 和 unique_ptr 的区别”,就继续追问自己:
- 引用计数怎么理解
- 为什么要有
weak_ptr - 多线程下安全吗
- 项目里用过吗
这样准备后,你在正式面试里就不容易被一追问就卡住。
十一、最值得优先背熟的高频题清单
如果时间不够,先把下面这些拿下:
- 指针和引用的区别
const和static的作用new/delete和malloc/free的区别- 栈和堆的区别
- 内存泄漏和 RAII
- 虚函数、虚析构、多态
vector底层和扩容机制map和unordered_map的区别shared_ptr、unique_ptr、weak_ptr- 左值右值、移动语义、
std::move - 线程和进程区别
- mutex、死锁、线程安全
- 项目中的 C++ 设计和容器使用
如果这 13 类你都能说顺,暑期实习里的 C++ 面试已经有相当不错的竞争力了。
十二、最后的准备建议
C++ 八股文准备,最忌讳两件事:
- 只看不说
- 只背定义不联系项目
真正有效的方式是:
- 知识点按模块整理
- 每题准备口语化答案
- 高频题反复复盘
- 用项目场景把答案串起来
- 练习被追问后的展开能力
暑期实习面试对 C++ 的要求,通常不是“特别深”,而是“基础是否扎实、表达是否清楚、项目是否能落地”。把这些高频八股准备好,你会发现面试里的很多问题其实都在一个框架内反复出现。

查看13道真题和解析
滴滴公司福利 2882人发布