锐明科技 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。

全部评论

相关推荐

喵_coding:年底缺人是短视频营造出来的 而且一般说的也很宽泛 不是特指后端
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

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