以下是 高频面试问题分类整理,帮助你系统准备:
一、基础语法与关键字
const 的作用
修饰变量(不可修改)、指针(const int* vs int* const)、成员函数(不修改成员变量)。
示例:const int* p(指向常量) vs int* const p(指针本身不可变)。
static 的用途
局部变量(生命周期延长)、全局变量/函数(仅当前文件可见)、类成员(属于类而非对象)。
指针 vs 引用
引用是别名(必须初始化,不可空),指针可重定向;引用更安全,指针更灵活。
volatile 的作用
防止编译器优化(告知变量可能被外部修改,如硬件寄存器)。
二、内存管理
堆 vs 栈
栈:自动管理,大小有限(函数局部变量);堆:手动分配(new/malloc),需释放。
new/delete vs malloc/free
new 调用构造函数,返回类型指针;malloc 仅分配内存,返回 void*。
内存泄漏检测方法
工具:Valgrind、AddressSanitizer;智能指针(shared_ptr/unique_ptr)预防。
智能指针的实现原理
shared_ptr:引用计数;unique_ptr:独占所有权(禁止拷贝);weak_ptr:解决循环引用。
三、面向对象(OOP)
虚函数(Virtual Function)与多态
虚函数表(vtable)实现运行时多态;override 显式声明重写。
虚析构函数的作用
确保通过基类指针删除派生类对象时,正确调用派生类析构函数。
纯虚函数与抽象类
纯虚函数:virtual void func() = 0;;含纯虚函数的类不能实例化。
多重继承的菱形问题
虚继承(virtual)解决重复基类问题(如 class D : virtual public B)。
四、STL(标准模板库)
vector 底层实现与扩容机制
动态数组,扩容时通常 2 倍增长(复杂度均摊 O(1))。
map 与 unordered_map 的区别
map:红黑树(有序,O(log n));unordered_map:哈希表(O(1),无序)。
迭代器失效场景
vector:插入/删除可能导致全部迭代器失效;map:仅删除当前元素失效。
五、多线程与并发
std::thread 的基本用法
示例:cpp
std::thread t([](){ cout << "Hello Thread"; });
t.join();
互斥锁(mutex)与死锁避免
使用 std::lock_guard 或 std::unique_lock 自动管理锁;避免嵌套锁。
原子操作(atomic)
无需锁的线程安全操作(如 atomic<int> counter)。
六、高级特性与C++11/14/17
Lambda 表达式
示例:auto f = [](int x) { return x * x; };
移动语义(Move Semantics)
std::move 转移资源所有权,避免拷贝(如 vector 的 push_back)。
右值引用与完美转发
T&& 用于区分左值/右值;std::forward 保持参数原始类型。
七、代码调试与优化
段错误(Segmentation Fault)常见原因:空指针解引用、数组越界、栈溢出。
inline 函数的优缺点
优点:减少函数调用开销;缺点:代码膨胀(慎用于大型函数)。
八、开放性问题
如何优化 C++ 程序性能?
答案方向:减少拷贝(移动语义)、缓存友好设计、多线程并行、算法优化。
你遇到过最难的 C++ Bug?如何解决的?
考察调试经验(可答内存泄漏、多线程竞争等)。