C++ 大厂面经分享

一、整体面试结构

大厂 C++ 岗位(尤其是系统方向 / 基础架构 / 客户端 / 中间件)面试通常分为三块:

  1. 语言基础(C++核心机制)
  2. 计算机基础(操作系统 / 计算机网络 / 数据结构)
  3. 工程能力(项目 + 设计 + 性能优化)

其中,C++本身的深度是区分普通开发者和高水平工程师的关键。

二、C++ 高频考点总览

1. 对象模型(核心中的核心)

必须理解到“实现层级”:

  • 对象内存布局
  • 虚函数表(vtable)
  • 多继承、虚继承内存结构
  • this 指针本质

典型考法:

一个类有虚函数时,内存结构如何?多继承情况下,vptr 有几个?

关键点:

  • 每个含虚函数的类有 vptr
  • 多继承 → 多个 vptr
  • 虚继承 → 引入虚基表(vbtable)

C++面试常考题目类型都放入了专栏了:https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW

2. 指针 & 引用本质

常考但容易被问深:

问题示例:

  • 指针和引用的区别?
  • 为什么引用不能绑定到临时对象(C++11之前)?
  • 右值引用解决了什么问题?

关键理解:

  • 引用本质是“受限指针”(编译器层面实现)
  • 右值引用用于:移动语义完美转发

3. 内存管理(必问)

常考问题:

  • new / malloc 区别
  • delete / delete[] 区别
  • 内存泄漏如何排查
  • 智能指针原理

必须掌握:

std::unique_ptr
std::shared_ptr
std::weak_ptr

深度问题:

  • shared_ptr 为什么是线程安全的?
  • weak_ptr 解决什么问题?

核心点:

  • shared_ptr:引用计数(原子操作)
  • weak_ptr:解决循环引用

4. 拷贝控制(五法则)

面试必问:

  • 拷贝构造函数什么时候调用?
  • 移动构造函数触发条件?
  • 什么是浅拷贝 / 深拷贝?

五法则:

析构函数
拷贝构造
拷贝赋值
移动构造
移动赋值

高频陷阱:

std::vector push_back 时发生了什么?

考点:

  • 扩容
  • 移动 or 拷贝
  • 异常安全

5. STL 底层实现(重点)

必考容器:

  • vector
  • map
  • unordered_map
  • list

高频问题:

vector:

  • 扩容机制(通常 1.5x / 2x)
  • 为什么连续内存?

map:

  • 红黑树实现
  • 为什么查找是 O(logN)

unordered_map:

  • 哈希表
  • 冲突解决(拉链法 / 开放地址法)

6. 模板与泛型编程(高阶)

常考:

  • 模板实例化过程
  • 模板特化 / 偏特化
  • SFINAE

进阶:

  • 完美转发
std::forward<T>(arg)

考察点:

  • 左值 / 右值保持
  • 万能引用

7. 多线程(大厂高频)

基础:

  • 线程创建
  • mutex / lock_guard
  • condition_variable

深度问题:

  • 死锁产生条件
  • 如何避免死锁?
  • CAS 是什么?

必须理解:

std::atomic

三、经典高频面试题(带解析方向)

1. vector 和 list 区别?

关键点:

内存

连续

非连续

查找

快(缓存友好)

插入

慢(搬移)

面试官真正想问:

缓存局部性(cache locality)

2. shared_ptr 为什么线程安全?

答:

  • 引用计数使用原子操作(atomic)
  • 但:对象本身不保证线程安全

3. 什么是右值引用?

核心一句话:

右值引用用于绑定“将要被销毁的对象”,从而触发资源转移而不是拷贝。

4. new/delete 和 malloc/free 区别?

关键点:

  • new 会调用构造函数
  • malloc 不会
  • new 类型安全
  • malloc 返回 void*

5. 虚函数是如何实现的?

必须说到:

  • vtable(虚函数表)
  • vptr(虚指针)
  • 运行时多态

6. 什么情况下会发生内存泄漏?

典型:

  • new 后未 delete
  • 循环引用(shared_ptr)
  • 容器持有指针未释放

7. map 和 unordered_map 区别?

核心:

结构

红黑树

哈希表

复杂度

O(logN)

O(1)(平均)

有序性

有序

无序

8. 线程安全的单例怎么写?

经典写法:

class Singleton {
public:
    static Singleton& instance() {
        static Singleton instance;
        return instance;
    }
private:
    Singleton() {}
};

考点:

  • C++11 静态局部变量线程安全

9. 什么是内存对齐?

考察:

  • padding
  • cache line
  • 提升访问效率

10. 什么是 RAII?

核心思想:

资源获取即初始化,生命周期绑定对象

典型:

std::lock_guard<std::mutex>

四、大厂真实加分项

1. 能讲清“底层原理”

不是会用,而是:

  • vector 为什么快
  • map 为什么是红黑树
  • shared_ptr 为什么安全

2. 项目要有“工程深度”

面试官重点看:

  • 是否做过性能优化
  • 是否处理过并发问题
  • 是否有架构设计经验

3. 能手撕代码(但不是算法岗)

常见:

  • LRU Cache
  • 简易线程池
  • 实现 shared_ptr(简化版)

五、总结

C++ 面试的本质:

不是考语法,而是考你对“语言背后机制”的理解深度。

如果只停留在:

  • 会用 STL
  • 会写业务代码

基本很难过大厂。

但如果你能做到:

  • 理解对象模型
  • 掌握内存与并发
  • 能讲清 STL 原理

那么通过率会明显提升。

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务