C++面试八股文清单
一、C++基础核心(必问)
1. 指针 vs 引用
核心区别:
-
指针:可以为空,可重新指向
-
引用:必须初始化,不可更改绑定对象
👉 面试加分点:
-
引用本质是“受限指针(语义层)”
2. const 关键字
常见问法:
const int a;
int const a; // 一样
const int* p; // 指向常量
int* const p; // 常量指针
const int* const p;// 都不可变
👉 口诀:
const 看右边,没有看左边
3. 堆 vs 栈
|
项 |
栈 |
堆 |
|---|---|---|
|
管理 |
编译器 |
程序员 |
|
速度 |
快 |
慢 |
|
大小 |
小 |
大 |
👉 面试加分:
-
栈溢出 vs 内存泄漏
4. 内存分区
-
栈区
-
堆区
-
全局/静态区
-
常量区
-
代码区
👉 常问:
static变量在哪?→ 静态区
二、类与对象(高频)
5. struct vs class
-
默认权限:
-
struct:public
-
class:private
-
👉 本质几乎一样
6. 构造函数 / 析构函数
-
构造:初始化
-
析构:释放资源
👉 高频:
析构函数为什么要虚函数?
✔ 防止“父类指针删除子类对象”资源泄漏
7. 拷贝构造函数
A(const A& other);
👉 什么时候调用:
-
传值
-
返回对象
-
初始化
8. 深拷贝 vs 浅拷贝
👉 核心:
-
浅拷贝:拷贝指针
-
深拷贝:拷贝数据
👉 面试加分:
-
避免 double free
9. this 指针
👉 本质:
-
指向当前对象
三、三/五法则(重点)
10. Rule of Three / Five
如果类涉及资源管理:
必须实现:
-
构造函数
-
拷贝构造
-
析构函数
C++11扩展:
-
移动构造
-
移动赋值
四、多态(核心考点)
11. 虚函数
virtual void func();
👉 实现机制:
-
vtable(虚函数表)
12. 多态实现条件
-
继承
-
虚函数
-
基类指针调用
13. 纯虚函数 & 抽象类
virtual void func() = 0;
👉 抽象类不能实例化
14. 虚函数表(高频深入)
👉 本质:
-
每个类一个 vtable
-
对象中有 vptr 指针
👉 面试加分:
-
多继承 → 多个vptr
五、C++11/14/17新特性
15. auto
auto x = 10;
👉 自动推导类型
16. nullptr
👉 替代 NULL(类型安全)
17. 智能指针(重点)
unique_ptr
-
独占
shared_ptr
-
引用计数
weak_ptr
-
解决循环引用
👉 面试经典:
shared_ptr 为什么线程不安全?
18. 右值引用(⭐⭐⭐)
int&& a = 10;
👉 用途:
-
移动语义
-
完美转发
19. move
std::move(x);
👉 本质:
-
强制转为右值
20. 完美转发
std::forward<T>(arg);
六、STL(必考)
21. vector vs list
|
vector |
list | |
|---|---|---|
|
底层 |
数组 |
链表 |
|
访问 |
快 |
慢 |
|
插入 |
慢 |
快 |
22. map vs unordered_map
|
map |
unordered_map | |
|---|---|---|
|
实现 |
红黑树 |
哈希 |
|
有序 |
✔ |
✘ |
23. set / unordered_set
👉 和 map 类似,只存 key
24. 迭代器失效
-
vector扩容 → 全失效
-
erase → 当前失效
七、多线程
25. 线程创建
std::thread t(func);
26. 线程同步
-
mutex
-
lock_guard
-
unique_lock
27. 条件变量
std::condition_variable
👉 用于线程等待/唤醒
28. 死锁
👉 解决:
-
加锁顺序统一
-
使用 try_lock
29. 原子操作
std::atomic<int>
👉 无锁线程安全
八、网络/工程向
30. new vs malloc
|
new |
malloc | |
|---|---|---|
|
类型 |
C++ |
C |
|
调用构造 |
✔ |
✘ |
31. delete vs free
👉 delete 会调用析构函数
32. 内存泄漏
👉 常见原因:
-
new 不 delete
-
智能指针循环引用
33. RAII(非常重要)
👉 核心思想:
用对象生命周期管理资源
-
lock_guard
-
智能指针
34. 虚析构 + 多态删除
Base* p = new Derived;
delete p; // 必须虚析构
35. 编译过程
-
预处理
-
编译
-
汇编
-
链接
36. 静态链接 vs 动态链接
-
动态库(.so)
-
运行时加载
37. 内联函数
inline
👉 减少函数调用开销
38. 宏 vs inline
👉 宏不安全,无类型检查
⭐ 必背
-
虚函数 / 多态
-
智能指针
-
右值引用 / move
-
STL(vector/map)
-
多线程(mutex/死锁)
-
new vs malloc
-
深拷贝/浅拷贝
更多推荐
所有评论(0)