版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++经典面试题及详细答案(企业真实版)一、C++基础语法面试题1、指针和引用的区别?(必考)详细答案:这是C++最基础也最常问的问题,核心区别集中在本质、初始化、修改、内存、空值五个点:1.本质不同:指针是一个独立变量,存储的是内存地址;引用是变量的别名,和原变量共用同一块内存,没有独立内存空间。2.初始化要求不同:引用必须在定义时初始化,且一旦绑定某个变量,就无法再绑定其他变量;指针可以不初始化,后续随时可以修改指向的内存地址。3.空值情况不同:引用绝对不能为NULL,不存在空引用;指针可以是NULL,代表不指向任何有效内存。4.使用方式不同:指针需要通过解引用*取值,通过->访问成员;引用直接使用即可,用法和普通变量一致。5.多级支持不同:存在二级、多级指针;没有多级引用。实战总结:普通变量传参、简化代码用引用;需要动态指向、可变指向、可能为空的场景用指针。2、const关键字的用法有哪些?详细答案:const的核心作用是只读保护,修饰的内容不可修改,常用四种场景:1.修饰普通变量:定义常量,变量初始化后无法修改,替代宏定义,安全性更高、可类型检查。例:constinta=10;2.修饰指针:分两种核心情况-constint*p:常量指针,指针指向的值不可改,指针本身的地址可以改;-int*constp:指针常量,指针本身的地址不可改,指向的值可以改。3.修饰函数参数:防止函数内部修改传入的实参,常用在引用、指针传参中,避免数据被意外篡改,同时省去拷贝开销。例:voidfunc(conststring&s)4.修饰类成员函数:const成员函数,函数内部不能修改类的任何成员变量,也不能调用非const成员函数,专门用于只读查询操作。3、inline内联函数的原理和优缺点?详细答案:1.原理:编译阶段,编译器会将内联函数的代码直接嵌入到调用处,不会产生函数调用跳转,省去函数压栈、出栈、参数传递的开销。2.优点:执行效率高,无函数调用开销;相比宏定义,有类型检查、语法校验,更安全,支持面向对象特性。3.缺点:会增加代码体积,每一处调用都会复制一份代码,代码量大的函数使用内联会导致程序体积膨胀。4.使用场景:只适合代码行数少(1-5行)、调用频繁的简单函数,递归函数、循环复杂函数不适合内联。二、面向对象OOP核心面试题1、C++三大特性及具体理解?详细答案:C++面向对象三大核心:封装、继承、多态,是项目代码复用和模块化的核心。1.封装:将类的成员变量和成员函数整合在一起,通过访问权限(public、private、protected)隐藏内部实现细节,只对外暴露可用接口。目的是降低耦合,防止外部随意修改内部数据,保证数据安全。2.继承:子类复用父类的属性和方法,实现代码复用,减少冗余。支持单继承和多继承,多继承可以实现多接口复用,但会增加代码复杂度。3.多态:同一接口,不同对象调用产生不同行为。分为静态多态和动态多态:-静态多态(编译期):函数重载、运算符重载,编译阶段就确定调用的函数;-动态多态(运行期):虚函数实现,运行时根据对象实际类型确定调用函数,是项目中最常用的多态。2、虚函数、纯虚函数、虚析构函数的区别和作用?详细答案:1.虚函数(virtual)定义:被virtual修饰的成员函数,存在虚函数表。作用是实现运行时多态,父类指针/引用指向子类对象时,调用子类重写的函数。2.纯虚函数定义:virtualvoidfunc()=0;,没有函数实现。包含纯虚函数的类是抽象类,无法实例化对象,只能被继承,强制子类重写该函数,常用于定义统一接口规范。3.虚析构函数核心作用:防止内存泄漏。当父类指针指向子类对象,delete父类指针时,如果析构函数非虚,只会调用父类析构函数,子类资源无法释放;虚析构函数可以保证先调用子类析构,再调用父类析构,完整释放所有资源。实战准则:只要类可能被继承,必须将析构函数声明为虚析构。3、重载和重写的区别?详细答案:1.函数重载发生在同一个类/同一作用域中,函数名相同,参数列表(个数、类型、顺序)不同,返回值不做区分。属于编译期多态。2.函数重写(覆盖)发生在父子类之间,子类重写父类的虚函数,要求函数名、参数列表、返回值完全一致。属于运行期多态,必须配合虚函数实现。三、内存管理与深浅拷贝(高频难点)1、浅拷贝和深拷贝的区别?什么时候需要深拷贝?详细答案:1.浅拷贝:编译器默认的拷贝方式,只拷贝变量本身的值。如果成员是指针,只会拷贝指针地址,不会开辟新内存,导致多个对象共用同一块堆内存。风险:对象析构时会重复释放同一块内存,引发程序崩溃。2.深拷贝:手动重写拷贝构造和赋值运算符,对于指针成员,重新开辟堆内存,拷贝指针指向的内容,每个对象拥有独立内存,互不干扰。3.必须深拷贝的场景:类中存在堆内存指针成员(new/malloc开辟的内存)时,默认浅拷贝一定会出问题,必须手动实现深拷贝。2、C++内存分区有哪些?各自存储什么数据?详细答案:程序运行时内存主要分为5个区域:1.栈区(stack):存储局部变量、函数参数、临时变量,由系统自动分配释放,空间小、速度快,函数执行结束自动回收。2.堆区(heap):存储new/malloc动态开辟的内存,由程序员手动申请、手动释放,全程需要自己管理,不主动释放会造成内存泄漏,空间大、灵活。3.全局/静态区:存储全局变量、static静态变量,程序启动分配,程序结束统一释放。4.常量区:存储字符串常量、const全局常量,内容只读,不可修改。5.代码区:存储程序二进制指令代码,只读,防止运行中被篡改。四、STL容器高频面试题1、vector和list的区别及使用场景?详细答案:1.底层结构-vector:动态数组,连续内存空间;-list:双向链表,非连续内存,每个节点存储数据和前后指针。2.访问效率-vector:支持随机访问,下标访问O(1),速度快;-list:不支持随机访问,只能遍历查找,访问O(n),速度慢。3.增删效率-vector:中间、头部增删需要移动元素,效率低;尾部增删较快;扩容会拷贝数据,有开销;-list:任意位置增删只需修改指针指向,无需移动元素,效率高,无扩容开销。4.使用场景-频繁查询、随机访问,少量增删用vector;-频繁插入、删除,几乎不随机访问用list。2、map和unordered_map的区别?详细答案:1.底层实现-map:红黑树(平衡二叉搜索树);-unordered_map:哈希表。2.有序性-map:key自动升序排序,遍历有序;-unordered_map:无序存储,遍历顺序随机。3.效率-map:增删查O(logn),稳定无冲突;-unordered_map:理想状态下增删查O(1),哈希冲突时效率下降。4.场景-需要key有序、数据量不大用map;-追求查询速度、不需要有序、数据量大用unordered_map。3、STL迭代器失效问题?哪些操作会导致失效?详细答案:迭代器本质是容器元素的指针/引用,容器结构发生改变时,迭代器会失效,继续使用会导致程序崩溃。1.vector失效场景:插入元素导致扩容、删除当前/后续元素,都会让原有迭代器失效;2.list/map失效场景:仅删除当前迭代器指向的元素会失效,其他迭代器不受影响,稳定性更强。解决方案:使用容器增删接口的返回值更新迭代器,不要复用旧迭代器。五、C++11新特性高频题1、auto和decltype的作用?详细答案:1.auto:编译期自动推导变量类型,简化长类型定义(如迭代器、智能指针),减少代码冗余,只能用于定义变量。2.decltype:推导表达式的类型,不会计算表达式的值,可用于获取复杂表达式、函数返回值的类型,常用于模板编程。2、智能指针的作用及三种类型区别?详细答案:1.unique_ptr:独占式智能指针,同一时间只能有一个指针管理内存,不支持拷贝,支持移动语义,独占资源,效率最高。2.shared_ptr:共享式智能指针,通过引用计数管理内存,多个指针可同时管理同一块内存,计数为0时自动释放,支持拷贝赋值,有轻微性能开销。3.weak_ptr:弱引用指针,不增加引用计数,专门解决shared_ptr循环引用导致的内存泄漏问题,不能单独使用,只能配合shared_ptr。六、易错坑点真题(面试高频追问)1、为什么不建议用memset初始化类对象?详细答案:memset是按字节赋值的底层函数,只适合初始化基础数据类型、结构体。类对象包含虚函数表指针、STL容器成员、自定义成员等复杂结构,使用memset会直接覆盖虚表指针、清空容器内部数据,破坏对象结构,导致虚函数失效、程序崩溃,因此类对象禁止用memset初始化。2、new和malloc的区别?详细答案:1.属性不同:new/delete是C++关键字,malloc/free是C语言库函数;2.初始化不同:new会调用构造函数初始化对象,malloc只开辟内存,不做任何初始化;3.类型安全:new有类型检查,返回对应类型指针;malloc返回void*,需要强制转换;4.异常处理:new内存失败会抛出bad_alloc异常;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《学法懂法守法》课件
- 《幼儿水果识图》课件
- 《我爱少先队》课件
- 《四节细胞通讯》课件
- 2026年公务员招考申论服务业高质量发展模拟试卷及答案
- 《画法几何及机械制图(3D版)》课件-第11章装配图
- 《型人格与销售沟通》课件
- 2026中国跨境电子商务行业发展现状及未来增长空间研究报告
- 2026年预检分诊制度流程考试题(附答案)
- 《地铁指向标志》课件
- 统编版初中道德与法治九年级上册6.1经济实力大幅提升 议题式教学课件(共21张)+内嵌视频
- 新人教版数学四年级上册《1亿有多大》教学课件
- 2026年魁北克驾驶员考试试题及答案
- 留置胃管操作介绍
- 2026《高一数学培优讲义》秋季(学生版)
- 2025年甘肃省综合评标评审专家库专家考试历年参考题库含答案详解
- 招标内审制度规范
- 2025年下半年中国电信集团限公司甘肃分公司春季校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 《当代广播电视概论(第3版)》全套教学课件
- 供水管道地质勘探服务合同
- (完整word版)现代汉语常用词表
评论
0/150
提交评论