在 C++ 面试中面试官常问的问题有哪些?

以下是 高频面试问题分类整理,帮助你系统准备:

一、基础语法与关键字

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?如何解决的?
  考察调试经验(可答内存泄漏、多线程竞争等)。

返回求职干货列表
立即解锁您的职业潜力
已有 15000+ 位学员通过我们的服务获得理想Offer
扫码咨询
扫码咨询 · 专属顾问
🎯 1v1专属服务 平均响应 < 5分钟 已服务15000+人
轻松获取Offer · 就来91邦途
扫码咨询 · 快速响应 · 专属求职顾问
“我们不做空洞建议, 只给可落地的求职方案。”
📄 简历诊断 📌 秋招陪跑 💬 面试辅导 📊 笔试测评 🤝 求职陪跑
小红书店铺客服

📕 小红书店铺

微信客服

💬 微信客服

🤝 1v1专属求职顾问 · 从简历到Offer全程陪跑 服务时间 9:00-21:00