这个专栏不是题库,也不是八股文速记卡。
它的目标是:把面试中最常被问到的 C++ 知识点,一个一个拆开讲透。每篇文章围绕一个关键字或一个概念,从"面试官通常怎么问"出发,讲清楚背后的原理,再给出能站住脚的回答思路。
读者背景假设:学过 C 语言,了解基本的 C++ class 用法,正在准备 C++ 相关的技术面试。
一、语言基础(必考)
关键字三剑客
-
- const 定义常量、const 与 #define 的区别、指针与 const 的四种组合、函数参数中的 const(值传递/指针/引用)、类中 const 成员函数与成员变量、const 与 static 的组合
-
- 函数内 static 变量、类中 static 成员变量与函数、文件作用域 static,四种含义逐个拆解。附带 C++11 线程安全初始化、C++17 inline static、Static Initialization Order Fiasco 等进阶知识点
-
volatile 关键字:被误解的"易变"
- volatile 的真实含义、与 const 的区别、多线程中的常见误用、什么时候真正需要 volatile(硬件寄存器、信号处理)
指针与引用
-
- 引用的本质(别名)、引用与指针的完整对比、引用作为函数参数与返回值、const 引用与临时对象、悬空引用的陷阱、引用折叠与万能引用
-
指针的七种用法
- 普通指针、指针的指针、数组指针、指针数组、函数指针、指向成员的指针、void* 与类型转换
-
智能指针:现代 C++ 的内存管理
- unique_ptr、shared_ptr、weak_ptr 的使用场景与实现原理、循环引用问题、make_shared 的优势、自定义删除器
二、面向对象(核心)
类的基础
-
构造函数与析构函数
- 默认构造、拷贝构造、移动构造、委托构造、继承中的构造顺序、析构函数的调用时机、为什么析构函数要是虚函数
-
拷贝控制:三五法则
- 拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数、Rule of Three/Five/Zero
-
this 指针的秘密
- this 指针的本质、在成员函数中的作用、返回 *this 的意义、const 成员函数中的 const this
继承与多态
-
- 虚函数的历史渊源、静态绑定与动态绑定、虚函数表(vtable)的实现机制、纯虚函数与抽象类、虚析构函数的重要性、对象切片陷阱
-
继承的三种方式
- public、protected、private 继承的区别、访问权限的变化、什么时候用哪种继承
-
多重继承与虚继承
- 多重继承的问题(菱形继承)、虚继承的解决方案、虚基类的内存布局、为什么要避免多重继承
运算符重载
-
运算符重载的艺术
- 哪些运算符可以重载、成员函数 vs 友元函数、赋值运算符的返回值、自增自减运算符的前置后置、输入输出运算符
-
类型转换运算符
- 隐式类型转换、explicit 关键字、类型转换运算符、转换构造函数
三、内存管理(高频)
-
new 与 delete 的底层机制
- new/delete 与 malloc/free 的区别、new[] 与 delete[] 的配对、placement new、内存池的实现思路
-
内存泄漏与检测
- 常见的内存泄漏场景、如何检测内存泄漏(valgrind、AddressSanitizer)、RAII 原则
-
栈与堆的区别
- 栈内存的分配与释放、堆内存的管理、栈溢出、内存碎片
四、现代 C++(C++11/14/17/20)
移动语义与完美转发
-
左值与右值
- 左值、右值、将亡值、纯右值、左值引用、右值引用、std::move 的本质
-
移动语义
- 为什么需要移动语义、移动构造与移动赋值、移动后的对象状态、返回值优化(RVO/NRVO)
-
完美转发
- 万能引用(universal reference)、std::forward 的作用、引用折叠规则
Lambda 表达式
- Lambda 表达式详解
- Lambda 的语法、捕获列表(值捕获、引用捕获、隐式捕获)、mutable 关键字、Lambda 的类型与 std::function
其他现代特性
-
auto 与 decltype
- auto 的类型推导规则、decltype 的使用场景、decltype(auto)
-
constexpr 与编译期计算
- constexpr 函数、constexpr 变量、编译期与运行期的区别
-
nullptr 与 NULL
- nullptr 的引入原因、NULL 的问题、类型安全
五、模板(进阶)
-
函数模板与类模板
- 模板的定义与实例化、模板参数推导、模板特化与偏特化
-
模板元编程基础
- 编译期计算、SFINAE、std::enable_if、类型萃取(type traits)
-
可变参数模板
- 参数包、参数包展开、递归展开与折叠表达式(C++17)
六、STL 容器与算法(实用)
容器
-
序列容器
- vector、deque、list 的实现原理与性能对比、vector 的扩容机制、迭代器失效问题
-
关联容器
- map、set、multimap、multiset 的底层实现(红黑树)、unordered_map、unordered_set 的底层实现(哈希表)
-
容器适配器
- stack、queue、priority_queue 的实现与使用
迭代器与算法
-
迭代器的五种类型
- 输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器
-
常用算法
- sort、find、binary_search、transform、accumulate 等算法的使用与复杂度
七、多线程(热门)
-
线程基础
- std::thread 的使用、线程的创建与销毁、join 与 detach
-
互斥与同步
- std::mutex、std::lock_guard、std::unique_lock、死锁的避免、条件变量(std::condition_variable)
-
原子操作
- std::atomic、内存序(memory order)、无锁编程基础
八、其他高频考点
-
四种类型转换
- static_cast、dynamic_cast、const_cast、reinterpret_cast 的使用场景与区别
-
异常处理
- try/catch/throw、异常安全保证(基本保证、强保证、不抛异常保证)、RAII 与异常
-
友元函数与友元类
- 友元的作用、友元的访问权限、为什么要慎用友元
-
命名空间
- namespace 的作用、using 声明与 using 指令、匿名命名空间
学习建议
- 先打基础:从"语言基础"和"面向对象"开始,这两部分是面试必考内容
- 重点突破:虚函数、智能指针、移动语义是区分度最高的知识点,务必吃透
- 结合实践:每个知识点都配有代码示例,建议自己动手写一遍
- 由浅入深:每篇文章都从基础讲起,逐步深入到底层实现和设计思想
- 关注现代 C++:C++11/14/17 的特性在面试中越来越常见,不要只停留在 C++98
这个大纲覆盖了 90% 以上的 C++ 面试考点。按照这个路线学习,能够建立起完整的 C++ 知识体系。