C++ 八股文速通
一、语言本质:C++ 是什么
C++ = 多范式语言支持:
- 面向过程(C 风格)
- 面向对象(class / inheritance / polymorphism)
- 泛型编程(template)
- 元编程(constexpr / TMP)
核心思想:
零成本抽象(Zero-overhead abstraction)—— 你不用的功能不会带来运行时开销
二、内存模型与对象生命周期
1. 内存分区
典型程序内存布局:
- 栈(stack):局部变量,自动分配释放
- 堆(heap):动态分配(new / malloc)
- 静态区(data / bss):全局变量、static变量
- 常量区:字符串常量等
- 代码区(text)
2. new / delete vs malloc / free
类型安全 | 有 | 无 |
构造函数 | 调用 | 不调用 |
返回类型 | 指针类型 | void* |
重载 | 可以 | 不行 |
本质区别:
new = malloc + 构造函数delete = 析构函数 + free
3. 对象生命周期
顺序:
- 分配内存
- 构造函数
- 使用
- 析构函数
- 释放内存
三、引用、指针与const
1. 指针 vs 引用
是否可为空 | 可以 | 不可以 |
是否可改指向 | 可以 | 不可以 |
语法 | 复杂 | 简洁 |
本质 | 地址变量 | 别名 |
本质理解:
引用 = 被限制的指针(语法糖)
2. const 的本质
const 修饰的是:
“不可通过该变量修改”
但不代表:
“该值绝对不变”
3. 常见 const 组合
const int *p; // 指向常量的指针(不能改值) int *const p; // 常量指针(不能改指向) const int *const p;// 都不能改
口诀:
const 看左边,没有看右边
C++面试常考题目类型都放入了专栏了:https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW
四、拷贝控制(核心高频)
1. 三/五法则
- 析构函数
- 拷贝构造
- 拷贝赋值
C++11 扩展为:
- 移动构造
- 移动赋值
2. 深拷贝 vs 浅拷贝
浅拷贝:
this->ptr = other.ptr;
深拷贝:
this->ptr = new int(*other.ptr);
问题:
浅拷贝会导致 double free
3. 移动语义(重点)
核心:
“偷资源,而不是复制”
A(A&& other) {
ptr = other.ptr;
other.ptr = nullptr;
}
4. std::move 本质
std::move(x)
本质:
强制转换为右值引用(并不移动)
五、右值引用与完美转发
1. 左值 vs 右值
左值 | 可取地址 |
右值 | 临时对象 |
2. 右值引用
int&& x = 10;
意义:
绑定临时对象,实现移动语义
3. 万能引用(forwarding reference)
template<typename T> void func(T&& t);
规则:
- 传左值 → T& → 折叠为 T&
- 传右值 → T&&
4. 完美转发
std::forward<T>(t)
作用:
保留原始值类别(左/右)
六、虚函数与多态
1. 多态条件
- 基类指针/引用
- 虚函数
- 运行时绑定
2. 虚函数表(vtable)
对象结构:
[ vptr ] -> vtable
调用过程:
- 通过 vptr 找 vtable
- 查函数地址
- 调用
3. 构造/析构中的虚函数
规则:
构造/析构期间不会发生多态
原因:
对象还未完整构造 / 已部分销毁
4. 纯虚函数
virtual void func() = 0;
作用:
- 定义接口
- 强制派生类实现
七、继承与对象模型
1. 继承方式
public | public | protected |
protected | protected | protected |
private | private | private |
2. 多继承问题
- 二义性
- 菱形继承
解决:
virtual inheritance
3. 虚继承本质
引入共享基类指针(vbptr)
八、模板与泛型编程
1. 模板本质
编译期代码生成(不是函数)
2. 模板实例化
- 隐式实例化
- 显式实例化
3. 模板特化
template<>
class A<int> {};
4. SFINAE
Substitution Failure Is Not An Error
用于:
- 类型判断
- 编译期分支
九、STL 核心原理
1. 容器分类
- 顺序容器:vector / list / deque
- 关联容器:set / map
- 无序容器:unordered_map
2. vector 扩容机制
- 容量翻倍(通常 1.5~2 倍)
- 重新分配内存
- 触发拷贝/移动
3. map vs unordered_map
结构 | 红黑树 | 哈希表 |
复杂度 | O(log n) | 平均 O(1) |
有序 | 是 | 否 |
4. 迭代器失效
典型:
- vector 扩容 → 全部失效
- list 插入 → 不失效
- map 插入 → 不失效
十、智能指针(必考)
1. unique_ptr
- 独占所有权
- 不可拷贝,可移动
2. shared_ptr
- 引用计数
- 多个指针共享
问题:
循环引用 → 内存泄漏
3. weak_ptr
- 不增加引用计数
- 用于解决循环引用
十一、并发与线程
1. 线程创建
std::thread t(func);
2. 线程同步
- mutex
- lock_guard
- unique_lock
3. 死锁条件
- 互斥
- 请求与保持
- 不可剥夺
- 循环等待
4. 原子操作
std::atomic<int>
保证:
无锁线程安全
十二、编译与链接
1. 编译过程
- 预处理
- 编译
- 汇编
- 链接
2. 头文件问题
- include 只是文本替换
- 需要 include guard / pragma once
3. inline 本质
建议编译器内联(不保证)
十三、常见面试陷阱
1. delete this
危险:
对象必须是 new 出来的
2. 野指针
未初始化 / 已释放
3. 内存泄漏
典型:
- new 没 delete
- 循环引用 shared_ptr
4. 未定义行为(UB)
- 越界访问
- 使用悬空引用
- 修改 const
总结(面试核心抓手)
真正高频考点可以压缩为 6 个核心:
- 对象模型(构造 / 析构 / 拷贝 / 移动)
- 内存管理(new/delete/智能指针)
- 多态(虚函数/vtable)
- 模板(泛型 + SFINAE)
- STL 原理(vector/map)
- 并发(mutex/atomic)
