一、问题总览
1.1 HR面
1.自我介绍
2.有什么兴趣爱好?
3.平时如何提高代码能力?
4.你说会刷题,平时用什么软件刷题?
5.期望薪资
6.未来有什么规划。
1.2 专业一面
1.详细讲讲 reactor模式的概念。
2.熟悉哪些设计模式?
3.递归是什么,递归是怎么实现的
4.继承,多态的作用。
5.虚函数。
6.了解内存分区吗,详细讲一下
7.static关键字
8.vector、list、deque 对比,什么时候使用?
9.讲讲智能指针
10.哪些手段可以避免死锁?
11.进程间通信有哪些方式
1.3 专业二面
1.虚函数,虚函数表
2.智能指针
3.C++STL
4.了解linux吗
5.数据库相关的知识
6.TCP
7.设计模式
二、HR面
3.平时如何提高代码能力?
答:
1.吃透核心概念、掌握数据结构与算法
2.读优质源码,模仿经典实现
3.多场景编码,适应不同需求
4.重视代码规范
5.学会调试与排错:掌握调试工具(GDB、VS Code Debugger),设置断点、查看调用栈、监控变量变化
6.参与真实项目,主动优化旧代码
7.输出倒逼输入:写技术博客、做分享、教别人编程,能帮你梳理知识漏洞
三、专业一面
1.详细讲讲 reactor模式的概念。
答:
- 定义:
Reactor 模式(反应堆模式)是一种事件驱动(Event-Driven)的并发编程模式,其核心思想是通过一个事件循环(Event Loop) 监听并分发事件,将 I/O 操作与业务逻辑解耦,从而提高系统的响应速度和资源利用率。- 核心概念与组件:
1.事件源(Event Source)
2.事件多路分发器(Event Multiplexer)
3.事件处理器(Event Handler)
4.反应器(Reactor)- 工作流程:
Reactor 模式的典型执行流程如下:
初始化:Reactor 注册事件源(如 Socket)和对应的事件处理器(如 “接收连接”“读取数据”)。
事件循环:Reactor 启动事件多路分发器,阻塞等待事件源就绪(如客户端连接请求、数据到达)。
事件触发:当某个事件源就绪(如 Socket 可读),事件多路分发器将其标记为就绪状态。
事件分发:Reactor 根据就绪事件,找到对应的事件处理器,调用其处理方法(如handleRead())。
业务处理:事件处理器执行具体业务逻辑(如解析数据、处理请求),期间可能触发新的事件(如 “写响应”),并再次注册到 Reactor 中。
2.熟悉哪些设计模式?
答:
设计模式的分类(经典 23 种)
1.单例模式(Singleton):保证一个类仅有一个实例,并提供全局访问点(如日志工具、配置管理器)。
2.工厂模式(Factory):通过工厂类统一创建对象,避免直接使用new,降低耦合(如不同数据库的连接工厂)。
3.递归是什么,递归是怎么实现的
答:
递归指函数直接或间接调用自身来解决问题的方式实现原理:
递归的底层依赖函数调用栈实现,每次递归调用都会触发以下步骤:
- 1.压栈(Push):
当函数调用自身时,系统会在栈中为新的函数调用创建一个栈帧(Stack Frame),存储当前函数的参数、局部变量和返回地址(即调用结束后回到哪里继续执行)。- 2.递归执行:
新的函数调用开始执行,若未达到基线条件,会继续压栈并调用自身,直到某个调用触发基线条件。- 3.出栈(Pop):
当函数达到基线条件并返回结果时,对应的栈帧会被弹出,结果传递给上一层调用,依次向上直到最外层函数返回最终结果。优点:代码简洁直观
缺点:
栈溢出风险:递归深度过大会导致栈帧过多,超出栈的最大容量
效率问题:频繁的栈操作和重复计算(如未优化的斐波那契递归)会导致性能损耗。
4.继承,多态的作用。
答:
继承和多态是面向对象编程(OOP)的两大核心特性,它们共同作用于代码的复用性、扩展性和灵活性
继承的作用
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,并可以在此基础上添加新的属性或重写父类方法。其核心价值在于代码复用和建立类之间的层次关系。
- 代码复用,减少重复
- 为多态奠定基础
多态的作用
多态是指同一操作作用于不同对象时,产生不同的执行结果。其核心是 “接口复用”,通过统一的接口实现不同的具体逻辑,降低代码耦合度。
- 统一接口,简化调用
- 提高代码扩展性
继承与多态的协同作用
继承让子类共享基础逻辑,避免重复劳动;
多态让父类接口可以适配各种子类实现,使系统易于扩展和维护。继承:核心是 “复用”,通过层级关系让子类共享父类功能,减少重复代码。
多态:核心是 “扩展”,通过统一接口适配不同实现,使代码更灵活、易扩展。
5.虚函数。
答:
虚函数是 C++ 中实现多态的核心机制,它允许子类重写父类的方法,使得通过父类指针或引用调用方法时,能自动执行子类的具体实现。
6.了解内存分区吗,详细讲一下
答
在程序运行时,操作系统会将内存划分为不同区域(分区),每个区域有特定的用途、生命周期和访问规则。
- 从低地址到高地址,内存通常分为以下几个区域:
代码区 → 常量区 → 全局/静态存储区 → 堆区 → 栈区 → 内核区
(不同系统的地址分布可能略有差异,但逻辑分区一致)
7.static关键字
答:
static 是 C/C++ 中一个多功能的关键字,可用于修饰变量、函数和类成员,其核心作用是控制作用域、生命周期或链接属性。
- 在函数内部用 static 修饰的变量,称为局部静态变量。
- 在函数外部用 static 修饰的变量,称为全局静态变量。
- 用 static 修饰的函数,称为静态函数。
8.vector、list、deque 对比,什么时候使用?
9.讲讲智能指针
答:
- 智能指针是 C++ 中用于自动管理动态内存的类模板,其核心作用是避免手动调用delete释放内存时可能出现的内存泄漏、double free(重复释放)等问题。
- 智能指针通过RAII(资源获取即初始化) 机制,在对象生命周期结束时(如离开作用域)自动释放所指向的内存。
10.哪些手段可以避免死锁?
答:
- 死锁是多线程 / 多进程并发编程中,多个线程因互相等待对方持有的资源而永久阻塞的问题。
- 避免死锁的核心是破坏死锁产生的四个必要条件(互斥、持有并等待、不可剥夺、循环等待)
11.进程间通信有哪些方式
答:
- 匿名管道
- 命名管道
- 共享内存
- 消息队列
- 信号
- 信号量
- 套接字