西门子 后端开发-C++ 一面

1. 自我介绍

2. C++面向对象的理解

C++面向对象核心是封装、继承、多态三大特性,核心思想是“将数据和操作数据的方法绑定”,模拟现实世界的实体抽象:

  • 封装:隐藏内部实现,对外暴露统一接口,提升代码安全性和可维护性;
  • 继承:复用已有类的代码,实现“代码复用+扩展”,体现“is-a”关系;
  • 多态:同一接口对应不同实现,分为静态多态(编译期)和动态多态(运行期),提升代码灵活性。面向对象的核心价值是降低耦合、提升代码复用性,适配复杂业务场景的模块化开发。

3. 封装的核心思想,封装的依据,以代码编写举例说明,封装的核心组成

  • 核心思想:将对象的属性(数据)和行为(方法)绑定,隐藏内部实现细节,仅通过公开接口与外部交互,核心是“信息隐藏”。
  • 封装的依据:按“单一职责”划分类的边界,仅暴露外部必需的接口,隐藏内部状态和实现逻辑(如避免直接访问成员变量)。
  • 代码示例:
  • 核心组成:私有成员(private,核心数据/内部方法)、保护成员(protected,给子类暴露)、公有接口(public,外部交互入口)。

4. 继承的子类和父类分别是什么,为什么要有子类,继承的范围,保护继承和公有继承的内外部区别

  • 父类/子类:父类(基类)是被继承的类,封装通用属性和方法;子类(派生类)继承父类,复用父类代码并扩展专属功能(如Animal是父类,Cat/Dog是子类)。
  • 为什么要有子类:代码复用:避免重复编写通用逻辑;功能扩展:子类可在父类基础上新增方法/重写方法;体现层级关系:符合“is-a”的语义(如Cat is a Animal)。
  • 继承的范围:父类的public/protected成员会被继承(private成员不可直接访问,需通过父类接口)。
  • 公有继承(public)vs 保护继承(protected):(注:private继承会将父类所有成员变为子类private,极少使用)

5. 静态多态和动态多态的区别,动态多态是如何实现的,虚表存的是什么内容

  • 静态多态 vs 动态多态:
  • 动态多态实现:父类声明虚函数(virtual),子类重写(override)该函数;编译器为含虚函数的类生成虚表(vtable),类对象存储虚表指针(vptr);运行期通过对象的vptr找到对应类的vtable,调用重写后的函数。
  • 虚表内容:存储类中所有虚函数的地址(父类虚函数地址/子类重写后的虚函数地址),每个含虚函数的类有且仅有一个虚表(所有对象共享)。

6. 父子类继承关系,有几个虚表,为什么析构函数写成虚函数

  • 虚表数量:每个“含虚函数的类(包括父类、子类)”各有一个虚表;若子类未重写任何虚函数,虚表中仍存储父类虚函数地址,但仍是独立虚表。示例:父类Base有虚函数,子类Derived重写虚函数 → Base有1个虚表,Derived有1个虚表,共2个。
  • 析构函数写虚函数的原因:若父类指针/引用指向子类对象,析构时若父类析构函数非虚函数,仅会调用父类析构函数,子类析构函数不执行,导致子类资源泄漏;声明为虚函数后,运行期会通过虚表调用子类析构函数(先析构子类,再析构父类),保证资源完整释放。

7. 引用和指针的区别,使用引用的要求和限制,引用有无内存消耗

  • 核心区别:
  • 引用的要求/限制:定义时必须绑定有效变量,不能单独存在;不能引用空值,不能引用临时对象(除非用const引用:const int &a = 10;);不能重载引用的++/--等运算符,需通过绑定的对象操作。
  • 内存消耗:语法层面无独立内存;底层编译器通常用指针实现(占8字节/4字节,与指针一致),属于“无感知的底层开销”。

8. C++为什么要引入引用

  1. 简化语法:替代指针实现参数传递(如swap(int &a, int &b)),避免指针的*/&操作,代码更简洁;
  2. 避免空值风险:引用必须绑定有效对象,消除空指针访问的隐患;
  3. 支持运算符重载:如operator[]返回引用,实现arr[0] = 10的直观语法;
  4. 函数返回值优化:返回引用可避免临时对象拷贝(如std::string& operator[](int idx))。

9. C++的内存分区,堆区存放的内容是什么,如何获取这块空间

  • C++内存分区:栈区(stack):存储局部变量、函数参数、返回值,自动分配/释放,大小固定(通常几MB);堆区(heap):动态分配的内存,手动申请/释放,大小灵活(受物理内存限制);全局/静态区(data):存储全局变量、静态变量(static),程序启动时分配,退出时释放;常量区(rodata):存储字符串常量、const常量,只读不可修改;代码区(text):存储程序编译后的二进制指令,只读。
  • 堆区存放内容:动态创建的对象(new Object())、动态数组(new int[10])、malloc申请的内存块。
  • 获取堆区空间:C++方式:new/new[](如int *p = new int(10););C方式:malloc/calloc/realloc(如char

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
感谢分享,吸欧气!
点赞 回复 分享
发布于 昨天 21:13 四川

相关推荐

评论
1
收藏
分享

创作者周榜

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