锐明科技 C++开发 二面 面经
1. C++中的多态是如何实现的?虚函数表的内存布局是怎样的?
答案:
- 通过虚函数表(vtable)和虚函数指针(vptr)实现
- 每个包含虚函数的类都有一个vtable,存储虚函数地址
- 对象内存布局:vptr位于对象起始位置,指向类的vtable
- 调用虚函数时:通过vptr找到vtable,再根据偏移找到函数地址
- 多重继承时会有多个vptr
- 虚函数调用是运行时决议,有轻微性能开销
2. 智能指针有哪几种?它们的区别和使用场景是什么?
答案:
unique_ptr:
- 独占所有权,不可拷贝只能移动
- 零开销,性能等同裸指针
- 适合明确单一所有者的场景
shared_ptr:
- 共享所有权,引用计数管理
- 线程安全的引用计数(原子操作)
- 有额外开销(控制块、引用计数)
- 适合多个对象共享资源
weak_ptr:
- 不增加引用计数的观察者
- 解决shared_ptr循环引用问题
- 使用前需要lock()转为shared_ptr
- 适合缓存、观察者模式
3. 左值引用和右值引用有什么区别?移动语义解决了什么问题?
答案:
左值 vs 右值:
- 左值:有名字、可取地址、持久存在
- 右值:临时对象、字面量、即将销毁
右值引用(&&):
- 可以绑定到临时对象
- 支持移动语义和完美转发
- 延长临时对象生命周期
移动语义解决的问题:
- 避免深拷贝,直接"偷"资源
- 提升容器操作性能(如vector扩容)
- 支持只移动类型(unique_ptr、thread)
- 返回大对象时自动优化
4. 什么是RAII?它解决了什么问题?
答案:
核心思想:
- Resource Acquisition Is Initialization
- 资源获取即初始化,利用对象生命周期管理资源
- 构造函数获取资源,析构函数释放资源
解决的问题:
- 自动资源管理,防止泄漏
- 异常安全,即使抛异常也能正确释放
- 代码简洁,无需手动释放
典型应用:
- 智能指针管理内存
- lock_guard管理锁
- fstream管理文件
- unique_lock管理互斥量
5. const关键字在C++中有哪些用法?
答案:
修饰变量:
- 常量,必须初始化,不可修改
修饰指针:
const int*:指向常量的指针,不能改值int* const:常量指针,不能改指向const int* const:都不能改
修饰成员函数:
- 承诺不修改成员变量
- const对象只能调用const成员函数
- 可以重载(const版本和非const版本)
修饰引用:
- 常量引用,不能通过引用修改
- 可以绑定到临时对象
修饰返回值:
- 防止返回值被修改
6. 说说C++的内存分区,各区域的特点是什么?
答案:
栈区(Stack):
- 自动分配释放,编译器管理
- 局部变量、函数参数
- 空间小(通常几MB),速度快
- 向低地址增长
堆区(Heap):
- 手动分配释放(new/delete)
- 空间大,速度较慢
- 向高地址增长
- 容易产生碎片
全局/静态区:
- 全局变量、静态变量
- 程序结束时释放
- 分为初始化和未初始化区
常量区:
- 字符串常量、const全局变量
- 只读,不可修改
代码区:
- 存放程序代码
- 只读,共享
7. 什么是内存对齐?为什么需要内存对齐?
答
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

OPPO公司福利 1225人发布