C++面试常见问题
好的,下面是一个 较为详细版本 的《面试基础题关键词 + 一句话解释》,适合你这种做系统/架构型开发者提前准备。每个关键词我尽量都加入一个简短场景或备注,方便你在项目中“活用”而不只是死背。你可以打印下来,或者做成手机备忘,面试前快速复习。
| # | 关键词 | 一句话解释 + 场景备注 |
|---|---|---|
| 1 | 进程三要素 | 程序段 + 数据段 + 进程控制块(PCB)——运行中进程的三大组成。场景:多进程上位机中,理解 PCB 能帮助你处理进程状态切换。 |
| 2 | 线程 vs 进程 | 进程是资源分配单位,线程是 CPU 调度单位;线程共享进程资源但有独立栈。场景:使用 QThread 时要知道资源隔离边界。 |
| 3 | 死锁四条件 | 互斥、占有且等待、不剥夺、循环等待——四个同时成立,系统才能发生死锁。场景:在设备驱动或多线程通讯里避免死锁设计。 |
| 4 | 观察者模式 | 当一个对象状态改变时,自动通知所有依赖它的观察者。典型角色:Subject + Observer + Attach/Detach + Notify。场景:Qt 信号-槽就是典型实现。 |
| 5 | 单例模式 | 保证一个类只有一个实例,并提供全局访问点。场景:配置管理器、日志管理模块常用。 |
| 6 | 策略模式 | 定义一系列算法,封装后可互换,使其可独立于使用者变化。场景:设备协议解析中,不同协议可切换策略。 |
| 7 | 装饰器模式 | 动态给对象附加职责,而不修改原有类。场景:功能扩展模块或插件机制中可用。 |
| 8 | SOLID 原则 | 单一职责、开放封闭、里氏替换、接口隔离、依赖反转——面向对象设计五大原则。场景:你的架构设计中体现模块清晰、接口稳定。 |
| 9 | 接口隔离原则(ISP) | 客户端不应强迫依赖它不使用的接口。场景:设备模块接口设计时,不让业务层暴露不必要操作。 |
| 10 | 依赖注入(DI)/控制反转(IoC) | 将依赖从内部创建转为外部注入,降低耦合。场景:驱动模块通过接口注入通讯层,而不是自己 new。 |
| 11 | 装饰者 vs 代理 区别 | 装饰者增强对象功能;代理控制对对象的访问。场景:日志代理 vs 功能增强模块。 |
| 12 | 内存分区 | 代码区、数据区(全局/静态)、堆、栈——程序运行时常见内存布局。场景:调优堆栈溢出或内存碎片时用得上。 |
| 13 | 共享内存 vs 消息队列 | 共享内存效率高但同步复杂;消息队列易管理但开销较大。场景:多进程通讯设计选型。 |
| 14 | 多线程竞态条件 | 多线程访问共享资源无同步机制,可能导致不可预测行为。场景:线程间分发数据、修改状态时需要锁或原子操作。 |
| 15 | QThread 与 Worker-Object 模型(Qt) | 在 Qt 中推荐模型:一个 QThread 只做线程容器,Worker 对象在该线程执行任务,避免直接继承 QThread。场景:上位机 UI 与后台通讯分离。 |
| 16 | 装饰者模式 vs 适配器模式 | 装饰者在不改原对象基础上增加行为;适配器把一个接口转换成另一个。场景:封装旧协议接口为新业务接口。 |
| 17 | 观察者模式 vs 发布-订阅模式 | 虽相似,但观察者更多是对象关系,发布-订阅通常跨模块/线程更松耦合。场景:模块间异步事件机制。 |
| 18 | 单例是否线程安全 | 单例模式若在多线程中懒加载需双检锁或 C++11 静态局部变量方式。场景:日志模块在多线程设备系统中。 |
| 19 | 设计模式分类(Creational/Structural/Behavioral) | 创建型(对象生成)、结构型(对象关系)、行为型(对象交互)三类。场景:你在面试中提“我把模式分为这三类”给人专业感。 ([GeeksforGeeks][1]) |
| 20 | 裸线程 vs 线程池 | 裸线程每任务一个线程,资源开销高;线程池复用线程,适合大量短任务。场景:设备通讯请求量大时用线程池更好。 |
