面向使用 C++ 应聘荣耀通用软件开发的校招候选人。本文整理 4 篇近三年、已核验正文及时间的公开面经,提供原帖索引、按轮次的题目摘要和去重复习清单。整理日期:2026-10-12。

**先看结论:**优先准备项目深挖、C++ 对象与内存、进程线程基础;二面也可能继续追问技术贡献和落地效果。有的场次没有手撕,也有共享屏幕写代码的记录,不要据单篇面经判断“荣耀不考算法”。

**资料边界:**近三年按整理日向前推三年,范围为 2023-10-12 至 2026-10-12;当前保留的 4 篇均发表于 2025 年。未核验到正文完整、时间和岗位都明确的 2026 年新同岗样本,不用旧帖补足数量。实习与通软综合面、岗位未明确的 C++ 补充样本单独标注;面经是个人回忆,不代表当前统一流程或必问题库。

原帖索引:先看最匹配的样本

筛选标准:荣耀公司;优先明确写“通软/通用软件”的原帖;正文确实包含 C++、项目或通软综合面信息。S1、S2、S3 为通软相关样本;S4 只确认作者使用 C++,正文未明确岗位名称,作为补充,不冒充同岗面经。时间指原帖日期或原文明确的场次年份,不等同于招聘届别。

编号与原帖时间岗位/适配重点
S1|荣耀通软实习面经2025-04-09通软实习;明确 C++项目网络编程;多态、STL、智能指针、weak_ptr 与循环引用
S2|荣耀 通软 一面2025-10-09通软;明确 cpp 问题项目深挖;虚析构、static、堆栈;口述二叉树遍历;无手撕
S3|荣耀二面面经(通软)2025-10-16通软二面;语言未明确实习贡献、困难与上线效果、毕设、笔试复盘、沟通协作
S4|荣耀 面试流程 记录2025-05-21C++ 候选人;岗位未明确构造析构、引用指针、重载重写、进线程、IPC;共享屏幕编码

逐篇面经:原帖实际记录了什么

以下按原帖归纳,不补造逐字问法、题干、面试时长或面试结果。“未记录”不等于“没有考察”。

S1:2025 通软实习,C++ 智能指针是直接考点

  • **一面:**自我介绍后深挖项目,重点是项目的网络编程部分;基础涉及 C++ 三大特性、多态、常用 STL 容器、智能指针、弱指针作用,以及如何打破循环引用。
  • **二面:**作者只概括为聊天面,没有给出完整题目清单。作者记录的一面为 4 月 7 日,二面为 4 月 9 日;该时间间隔只是个案。
  • **岗位提醒:**作者听到当次部门以 Java 为主。不能由“候选人用 C++”推导“入职一定做 C++”;应反问目标团队的实际语言与业务。

S2:通软一面,项目讲得最久,基础题不算偏

  • **项目:**原帖强调项目问得很细、占时最长;还问了为什么不读研而选择工作。
  • **C++:**多态,为什么基类析构函数要设为虚函数,static 的作用,堆与栈的区别。
  • **数据结构:**给一张二叉树图,口述前序、中序和后序遍历结果;该场没有手撕代码。
  • **时间:**已进一步核验原帖页面的发布时间元数据,发布日期为 2025-10-09;不是使用评论日期推断。

S3:2025 通软二面,重点证明“确实做过”

  • **实习:**工作内容、自己开发的部分、技术点、库管理如何实现、遇到的困难、实现效果、是否上线。
  • **科研与求职:**毕设思路、研究方法与当前进度;非计算机专业为什么选择开发;对工作地点的看法;院校选择。
  • **复盘与协作:**笔试未满分的原因,有没有复盘;举例说明实习或学校经历中的合作沟通能力。
  • **反问:**部门业务、工作作息。作者记录交流约 40 分钟。

S4:2025 C++ 面试记录,确实存在共享屏幕写代码

  • **岗位未明确:**标题和正文是荣耀面试流程记录,作者资料标注 C++;只作为 C++ 技术面补充。
  • **一面:**项目场景、论文创新点、专利或论文贡献;C++ 内存模型、构造与析构、引用与指针、面向对象、overload 与 override、虚函数,进程与线程、IPC。
  • **编码:**本地 IDE 共享屏幕写一道题,再追问内存安全。原帖未提供题干,不把它补写成某道 LeetCode 题。
  • **二面:**参与时间最长的项目、印象最深的事情、性格评价、为什么参加荣耀面试等综合问题。

按模块去重:可以直接自测的问题

以下只使用本次保留的近三年面经,按原帖考点复述与拆分,括号内是出处,不是逐字采访稿。“重点”指在这组有限样本中值得复习,不是统计出的全公司命中率。

**答案校对|2026-10-12:**本次检查你填写的 10 条基础题答案,按 C++17 常用语义整理,并单独标注 C++11/C++17 相关边界。每题保留原题,答案按“点评 → 修订回答 → 补充/追问”排列。以下技术解释和代码是备考补充,不是新增荣耀面经,也不冒充你的项目经历。

**优先修正:**虚表不是每个类都有;非虚析构的基类指针跨类型普通 delete 是未定义行为;重载、重写与运行时分派要分清;“内存模型”须区分进程布局与 C++ 并发语义。

**重点补齐:**容器的选型/复杂度/迭代器失效,weak_ptr 的 lock() 和所有权方向,局部 static 的初始化线程安全边界,线程共享资源与 IPC 的用途。

**仍需你补的部分:**二叉树遍历已补充通用方法,但具体项目难题、个人贡献、协作案例和综合面回答目前仍是准备框架,需要用你的真实经历填写;没有证据的性能数字、使用经历或上线效果不要补造。

技术校对参考(不计入面经样本):虚函数与虚析构;存储期与 static;构造顺序;数据竞争与同步;哈希容器失效规则;weak_ptr;POSIX 线程资源。

C++ 对象、容器与资源管理

  1. C++ 三大特性是什么?运行时多态如何体现?(S1、S2)

**点评:**需要修正:不是每个类、每个对象都有虚表/虚表指针;也不是通过基类指针调用任意成员函数都会动态分派。缺少“虚函数”和“引用”这两个条件。

**修订回答:**C++ 三大特性是封装、继承和多态。封装通过访问控制与接口隐藏实现细节;继承用于表达类型关系和复用;多态让同一个接口可以有不同实现。

运行时多态的典型场景是:用基类指针或引用指向派生类对象,调用基类声明为 virtual、派生类重写的函数;实际调用取决于对象的动态类型。非虚成员函数不会仅因通过基类指针访问就自动获得动态分派。

主流编译器常用虚表与虚表指针实现分派,但这是常见实现方式,不是 C++ 标准规定的对象布局。普通非多态类不一定有虚表,多重继承也可能涉及多组虚表/虚表指针,不能一概说“每个类一张、每个对象一个”。

**补充/追问:**重载等常见形式的选择在编译期完成;virtual 是运行时多态的关键条件。构造/析构期间的虚调用只分派到当前正在构造/析构的类层次,而不是更派生的版本;限定调用 Base::f() 会抑制虚分派。

  1. 为什么多态基类常用虚析构?哪些使用方式需要它?(S2)

**点评:**需要修正:虚析构的理由不是“派生类成员变量不同”,而是通过基类指针销毁派生对象时,需要正确完成整个析构链。

**修订回答:**在普通 delete 场景下,如果 Base* 实际指向 Derived 对象,且要通过这个 Base* 删除它,Base 的析构函数应为 virtual。这样会先执行派生类析构,再析构其成员和基类,保证资源按完整对象的层次释放。

如果这种跨类型删除使用的基类析构不是 virtual,行为是未定义的,不只是“少调用一个析构导致内存泄漏”。本答案以 C++17 常用删除语义为基础。

派生类不必为了多态删除而手写析构函数;只要基类析构是 virtual,派生类隐式生成的析构也会重写它。也不是所有基类都必须虚析构:若禁止经基类指针删除,protected 非虚析构也是一种设计选择。

**补充/追问:**常用写法是 virtual ~Base() = default;。虚析构用于销毁,并不要求所有其他成员函数都声明为 virtual。

  1. static 在不同位置分别有什么作用?(S2)

**点评:**基本正确。建议补充文件作用域的静态函数、局部 static 的初始化线程安全边界,以及类静态成员的定义规则。

**修订回答:**命名空间/文件作用域的 static 变量和非成员函数具有内部链接,其名字只能在本翻译单元内被直接引用;这限制的是名字的链接属性,不等于禁止经已获得的指针或接口使用该对象。

函数中的局部 static 具有静态存储期,作用域仍限于原作用域;需要动态初始化时,通常在控制流第一次经过声明时完成初始化。初始化成功后不会重复;若初始化抛异常,下次经过声明时可以重试。C++11 起并发初始化受到语言保证,但后续对对象的读写不会因此自动线程安全。

类的 static 数据成员属于类,由同一类的对象共享,不占每个对象的独立成员存储。普通的非 inline 静态数据成员在被 ODR 使用时一般需要类外定义;C++17 起可用 inline static 在类内定义。

静态成员函数没有 this 指针,不能直接访问非静态成员,但可通过显式对象或指针访问;它不能是虚函数。静态成员函数也不需要先创建对象才能调用。

**补充/追问:**区分作用域、链接属性和存储期;不要把“局部 static 的初始化线程安全”说成“static 变量的所有操作都线程安全”。

  1. 堆与栈有什么区别?(S2)

**点评:**方向正确,但要避免“堆一定更大”“堆只能手动管理”等绝对表述;每个线程有自己的栈也不代表线程间的地址空间隔离。

**修订回答:**在常见平台实现中,自动存储期局部变量通常由线程栈承载,执行到定义时初始化、离开相应作用域或异常展开时按规则销毁;栈具有后进先出的分配特征,但变量也可能被优化到寄存器或消除。C++ 标准不强制所有局部变量必须物理存放在栈上。

动态存储期对象通常通过 new/分配器等创建,其生命期可以超过创建它的作用域。裸 owning 指针需要正确释放资源,但也可以用 unique_ptr、shared_ptr 和容器通过 RAII 管理,不需要到处手写 delete。

线程栈大小和可用动态内存受平台、线程配置与地址空间限制,没有固定的大小关系保证。动态分配通常有分配器管理开销,也可能产生碎片,不能用一个固定性能结论覆盖所有分配器。

同一进程的线程共享地址空间,通常共享堆、全局变量等;每个线程有独立的栈和执行状态,但其他线程若得到有效地址,仍可能访问它的栈上对象。此时也要保证对象生命期和必要的同步。

**补充/追问:**局部 vector 对象可以在栈上,而其动态元素存储通常在自由存储区;区分对象本身的存放位置、所管理资源的位置和资源的所有权。

  1. 构造与析构过程是什么?引用与指针有什么区别?(S4)

**点评:**构造顺序的回答总体正确。还应补充虚基类由最派生类负责初始化、完整的析构尾部顺序,以及引用悬空和构造失败的边界。

**修订回答:**构造最派生对象时:先按继承图规定的深度优先、从左到右顺序初始化虚基类;再按基类声明顺序初始化直接非虚基类;接着按声明顺序初始化非静态数据成员;最后执行该类构造函数体。虚基类由最派生类负责初始化,不按初始化列表的书写顺序决定。

析构时:先执行该类析构函数体,再按声明逆序析构非静态成员、按构造逆序析构直接非虚基类;销毁最派生对象时,虚基类在最后析构。通过基类指针删除派生对象时,要满足虚析构等相应条件。

引用是已绑定对象的别名,初始化后不能重新绑定;r = other 通常是给被引用对象赋值,不是改绑。指针是保存地址的对象,可以改变指向,也可以为 nullptr。引用和指针都可能悬空,引用并不天然保证被引用对象一直有效。

不要把“引用不占内存”当成标准保证;编译器可以按实现需要保存绑定关系。若构造函数抛异常,已经完成构造的成员和基类会被清理,但构造未完成对象自身的析构函数不会因此被调用。

**补充/追问:**普通局部引用应在定义时绑定到有效对象;不要返回指向局部对象的指针或引用。构造与析构期间的虚调用行为也值得准备。

  1. 重载 overload 与重写 override 有什么区别?虚函数如何参与其中?(S4)

**点评:**需要说准:重载是“参数列表等可区分特征不同”,不是“函数列表不同”;重写与运行时分派不是同一个概念。

**修订回答:**重载 overload 通常指在同一相关作用域内,多个函数同名,但参数类型、数量、顺序等可区分特征不同;调用时先进行编译期重载决议。只改变返回类型,不能构成函数重载。

重写 override 指派生类函数覆盖基类的虚函数,需要匹配参数类型及成员函数的 cv/引用限定等,并满足返回类型兼容等规则;符合条件时允许协变返回类型。派生类即使不再写 virtual,也仍是虚函数。

override 关键字用于让编译器检查“这确实重写了基类虚函数”,不是开启运行时多态的开关。实际的虚调用在符合条件时按对象动态类型分派;一个被重载决议选中的函数也可能继续进行虚分派。

派生类只写一个与基类同名但参数不同的函数,可能是在隐藏基类的名字,而不是重写。必要时用 using Base::f; 重新引入基类的重载集合。

**补充/追问:**常见失误是基类 f() const、派生类却写 f(),这并未重写;写 override 可以让编译器及时发现。

  1. 常用哪些 STL 容器,如何按业务选择?(S1)

**点评:**目前只列了容器名,缺少这道题的核心:选择理由、复杂度和迭代器失效规则。

**修订回答:**vector:连续元素存储,随机访问 O(1),尾部追加摊还 O(1),中间插入/删除通常 O(n)。遍历密集、需要随机访问时通常优先考虑,连续布局往往更有利于缓存局部性。

list:双向链表。已知有效迭代器位置时,插入/删除通常 O(1),但寻找位置或按下标访问是 O(n),也有节点分配和缓存局部性成本。不能把“链表插入删除 O(1)”套用于“先查找再修改”的全过程。

map:按键有序,查找/插入/删除 O(log n),适合有序遍历和范围查询;主流实现常用红黑树,但标准不强制这一种树实现。

unordered_map:哈希容器,查找/插入/删除平均 O(1),最坏可能 O(n),迭代顺序没有排序保证。只做按键检索且不需要有序结果时可考虑它,并关注哈希质量、负载因子和容量规划。

失效规则:vector 扩容会使已有迭代器、指针和引用失效,不扩容时插入/擦除也有各自的局部失效规则;list/map 的插入通常不使已有迭代器和引用失效,erase 只使被删除元素的迭代器和引用失效;unordered_map 的 rehash 会使迭代器失效,但不会仅因 rehash 就使已有元素的指针和引用失效。

**补充/追问:**用一个真实业务例子说明选择:要不要排序、随机访问还是顺序遍历、是否保留元素地址、修改时是否已知位置。别只背复杂度;容器的并发读写另需满足线程安全规则。

  1. 智能指针解决什么问题?weak_ptr 有什么作用?如何打破 shared_ptr 循环引用?(S1)

**点评:**方向正确。需区分独占与共享所有权,补充 weak_ptr 不增加强引用计数、lock() 的正确使用以及 shared_ptr 的线程安全边界。

**修订回答:**智能指针用 RAII 把资源管理与对象生命期绑定。unique_ptr 表达独占所有权,不能复制但可以移动;shared_ptr 表达共享所有权,在最后一个强拥有者释放时销毁所管理对象。不是“任何一个 shared_ptr 离开作用域都会销毁对象”。

weak_ptr 是共享所有权体系里的非拥有观察者,不增加强引用计数,也不能直接解引用。使用 lock() 尝试获得 shared_ptr:成功时,该强引用会在持有期间维持对象生命期;失败时得到空 shared_ptr。

两个对象若彼此用 shared_ptr 强拥有,即使外部强引用全部释放,环里的强计数仍可能不归零。应先设计所有权方向,再把不应承担拥有职责的回指/观察关系改为 weak_ptr;不要随意把任意一条业务上必须拥有的边改成弱引用。

不要只先检查 expired() 再假定对象一直存在;检查后状态可能改变,真正使用时以 lock() 的结果为准。共享控制块的引用计数操作有相应线程安全保证,不等于对象字段或同一个 shared_ptr 变量的任意并发修改都自动安全。

**补充/追问:**优先使用 make_unique/make_shared 等工厂;不要用同一个裸指针分别创建两个彼此独立的 shared_ptr 控制块,以免重复释放。

#include <memory>
 
struct Node {
    std::shared_ptr<Node> child; // 拥有关系
    std::weak_ptr<Node> parent;  // 观察关系,不增加强引用计数
};
 
void example() {
    auto parent = std::make_shared<Node>();
    auto child = std::make_shared<Node>();
    parent->child = child;
    child->parent = parent;
 
    if (auto owner = child->parent.lock()) {
        // 在 owner 的生命期内,parent 对象保持存活。
        // 实际访问共享字段时,仍需按并发场景进行同步。
    }
}
 

操作系统与内存安全

  1. 进程与线程有什么区别?有哪些进程间通信方式?(S4)

**点评:**基本概念正确,但还缺少进程隔离与线程共享哪些资源。IPC 里信号量主要负责同步,不应与数据传输通道混为一谈。

**修订回答:**常见操作系统中,进程是资源管理和隔离的重要单位,有自己的虚拟地址空间等资源;线程是进程内的执行和调度单位。每个线程有自己的程序计数器、寄存器状态、栈和线程局部存储,同一进程的线程共享地址空间以及进程级资源。

因此,线程间传递数据通常方便,但共享对象必须正确同步,线程问题也可能影响整个进程。不同进程的普通私有地址空间相互隔离,需要 IPC;隔离不意味着它们共享外部文件或设备时绝不会互相影响。

常见 IPC:匿名管道和命名管道用于流式传输;消息队列传递有边界的消息;共享内存可减少进程间复制,但需配套进程间同步;socket 可用于本机或网络通信;信号适合通知;信号量主要协调访问顺序与资源数量。

线程切换通常比跨进程切换的资源/地址空间切换成本小,但具体性能依赖系统实现。共享内存并不会自动线程/进程安全;也不能把普通 std::mutex 当成标准保证可跨进程使用的锁。

**补充/追问:**选 IPC 时说明是否跨机器、是否需要消息边界、数据量、时延、可靠性及同步方案;这些应根据题目场景选择,不编造自己用过的经历。

  1. “内存模型”如何解释?先确认问的是进程内存布局还是 C++ 并发内存模型;原帖未说明具体层次。(S4)

**点评:**你目前答的是常见进程虚拟内存布局,方向正确;但题目也可能指 C++ 并发内存模型,这一半还没回答。

**修订回答:**先确认面试官问的是哪一层。若问常见 Linux 进程虚拟地址空间,可介绍代码段、只读数据、已初始化全局/静态数据所在的数据段、零初始化数据常见的 BSS、动态分配区域、内存映射区域和线程栈。这是常见实现布局,不是 C++ 标准规定的固定分区。

const 不等于必然存放在某个“常量区”:局部 const 对象可以有自动存储期,常量也可能被优化为立即数等;具体存放受存储期、编译器和优化影响。

若问 C++ 并发内存模型,重点是原子性、同步关系和 happens-before:不同线程对同一内存位置进行冲突访问,至少一个是写,且存在非原子访问又没有必要的 happens-before 关系,就可能构成 data race,导致未定义行为。

互斥锁可以保护共享数据并建立同步;atomic 提供对应的原子操作。memory_order_relaxed 只提供相应原子访问保证,不能据此把其他数据的发布顺序也认为安全。release 发布与读取相应发布值的 acquire 操作可以建立同步,让发布前的写入对同步后的读取按语言规则可见。

volatile 不能替代 atomic 或锁来解决普通 C++ 多线程的数据竞争。默认的 seq_cst 原子操作提供较强的顺序保证,但不代表程序里所有普通读写都自动线程安全。

**补充/追问:**下面只演示一次发布:ready 初始为 false,payload 只在发布前由生产者写;消费者在观察到相应发布后读取。不能直接套用于多个生产者或反复更新;工程中还要考虑等待方式,避免不必要的忙等。

#include <atomic>
 
int payload = 0;
std::atomic<bool> ready{false};
 
void produce() {
    payload = 42;
    ready.store(true, std::memory_order_release);
}
 
int consume() {
    while (!ready.load(std::memory_order_acquire)) {
        // 教学示例:仅演示一次发布,不是生产环境的等待方案。
    }
    return payload;
}
 

编码结束后可能继续追问内存安全(S4);原帖未展开具体问题,不补造“考过某个排查工具或内存序”的记录。

算法、数据结构与编码形式

  • **已记录题目:**口述二叉树前/中/后序遍历(S2)。

**补充回答|二叉树遍历:**前序是根—左—右,中序是左—根—右,后序是左—右—根。递归时先判断节点是否为空,再按对应顺序安排访问当前节点和遍历左右子树。

**复杂度:**每个节点访问一次,时间 O(n);不计输出存储,递归辅助空间为 O(h),h 是树高。平衡树通常为 O(log n),退化成链时为 O(n),要关注深递归的栈空间风险。

**边界:**当前面经没有提供具体二叉树图,不能编造那次面试的遍历序列;拿到图后应按上述规则逐节点推导。非递归遍历可用显式栈,但不能因此把辅助空间一概说成 O(1)。

  • **编码形式:**存在共享屏幕在本地 IDE 编码的记录(S4),但题干未知;S2 的场次没有手撕。
  • **练习建议,非新增真题:**用 C++ 实现二叉树遍历,说明时间/空间复杂度,测试空树、单节点和不平衡树;至少完整演练一次共享屏幕编写、编译、运行和解释代码。

复习要点:不要只背术语

本节是整理者的补充建议,不是原帖记录的答案或新发现的荣耀真题。

  • **多态与虚析构:**讲清基类指针/引用与虚函数重写。若通过 Base* 删除派生对象,普通多态场景下基类需要虚析构;不是“所有基类都必须虚析构”。虚表与虚表指针是主流实现,非标准强制布局。
  • **智能指针:**区分 unique_ptr 的独占所有权、shared_ptr 的共享所有权、weak_ptr 的非拥有观察。weak_ptr 不增加强引用计数,使用 lock() 获取可用对象;解决循环引用要设计正确的所有权方向,而非随意把所有指针换成弱指针。
  • **内存与崩溃:**能结合实际平台讲复现、日志、调用栈、调试器和检测工具的使用;区分“越界可能导致段错误”与“所有越界都会立刻崩溃”。不要声称使用过自己没有实际用过的工具。
  • **网络扩展,非原帖逐项题目:**若简历写了网络项目,再准备 TCP/UDP、阻塞与非阻塞、select/poll/epoll 及所用模式;把每个概念对应到自己的代码和选择理由。
  • **数据库边界:**这组已核验的 C++ 面经正文不足以支持“Redis/MySQL 一定问”的结论。简历或目标团队涉及数据库时仍应复习,但不要把评论猜测、搜索生成摘要或其他岗位题单当成本次同岗原题。

项目深挖与二面准备

每个项目准备一条能被追问的数据链

项目在 S1、S2、S3、S4 中都有记录,是本组样本最一致的信号。下面的讲述框架是准备建议,不是统一面试模板。

  1. **背景与职责:**服务谁、解决什么问题;自己负责的模块、接口与代码边界。
  2. **架构与数据流:**从请求或事件进入,到处理、存储、返回;哪些地方并发,哪些资源共享。
  3. **方案与取舍:**为什么选该框架、容器、线程模型或通信方式;考虑过什么替代方案。
  4. **困难与定位:**一个真实问题,如何复现、缩小范围、验证根因、修复和回归。
  5. **效果与证据:**是否上线,如何验证效果。性能提升只报真实测量,并说明基线、负载和环境;没做压测就如实说明。
  6. **复盘:**还存在哪些限制,再做一次会怎样改。

综合面的问题也要用真实经历回答

  • **动机:**为什么选开发、为什么不读研、为什么荣耀;与专业背景如何衔接。(S2、S3、S4)
  • **技术贡献:**实习具体做了什么,困难与效果,是否上线;论文/专利贡献,毕设进度。(S3、S4)
  • **协作:**举例说明实习或学校经历中体现合作沟通能力的事情。(S3)
  • **复盘与自评:**笔试失分原因、性格评价、印象最深的事情。(S3、S4)
  • **现实匹配:**对工作地点的看法。(S3)回答自己的真实边界,不为了迎合而编造意愿。

准备 3 个简洁案例:一次技术难题、一次协作分歧、一次失败或复盘。按“背景—个人行动—结果—反思”讲,避免把团队成果全算到自己头上。

适合反问的问题

  • 这次招聘对应哪个团队和业务?C++ 的实际使用场景是什么,是否涉及 Java、Android 或其他技术栈?
  • 新人入职后主要负责什么,团队如何做代码评审、测试和培养?
  • 后续环节、面试形式和安排以哪条官方通知为准?
  • 根据今天的面试,哪些能力最值得继续补强?

通知、测评、二面间隔和“录用决策中”等状态只反映各作者当时经历,不据此承诺当前流程、通过结果或 offer。

考前可执行清单

  • 能用 2—3 分钟介绍主项目,再围绕架构、职责、难题和效果回答连续追问。

  • 能讲清多态、虚析构、构造析构、static、重载重写、引用指针和堆栈。

  • 能举例选择 STL 容器,解释智能指针、weak_ptr 与循环引用的所有权关系。

  • 能解释进程/线程、IPC 和内存模型;能把内存安全问题与自己的编码实践对应起来。

  • 能讲一个真实的内存安全或崩溃定位案例;没有经历时,明确区分练习与真实项目。

  • 能独立写二叉树遍历,编译运行并测试边界;已演练共享屏幕写代码。

  • 已复盘自己参加过的笔试;未知题干不编造,做过的题能解释思路与失分原因。

  • 准备好 3 个综合面案例,以及岗位动机、地点/工作节奏的真实回答。

  • 确认本次通知中的岗位、轮次和形式,并准备询问团队实际 C++ 使用范围。

已有复习资料入口

维护说明:来源均为公开个人面经;优先使用与自己岗位、招聘类型、团队和年份更接近的样本。更新时应核验原帖正文及时间,区分原创、转引、评论和页面推荐内容,不把它们重复统计为独立面经。