版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++高频面试题库及详细答案(真实面试版)一、C++基础语法高频题1、C和C++的核心区别是什么?1)编程思想不同:C是面向过程,侧重流程和函数;C++兼容C,同时支持面向对象、泛型编程,适合大型项目开发。2)语法特性差异:C++新增类、继承、多态、封装、引用、重载、模板、异常处理、命名空间等特性,C不支持。3)类型安全:C++类型检查更严格,杜绝很多隐式类型转换的隐患,代码容错性更高。4)内存管理:C依赖malloc/free;C++支持new/delete,会自动调用构造、析构函数,支持对象生命周期管理。5)标准库:C++拥有完善的STL容器、算法库,开发效率远高于C。2、const关键字的用法有哪些?各自作用?const的核心是只读修饰,修饰后内容不可修改,主要四种用法:1)修饰普通变量:constinta=10;变量无法二次赋值,初始化必须直接赋值。2)修饰指针:-constint*p:指针指向的值不可改,指针本身地址可以改;-int*constp:指针地址不可改,指向的值可以改;-constint*constp:地址和值都不可改。3)修饰函数形参:防止函数内部修改实参内容,提升代码安全性,常用在传参避免拷贝。4)修饰成员函数:voidfunc()const;该函数内无法修改类的成员变量,也不能调用非const成员函数,常用于只读查询函数。3、define和const的区别?1)预处理阶段不同:define是预处理宏替换,编译前直接文本替换,无类型检查;const是编译阶段处理,有严格类型校验。2)类型差异:define无数据类型;const有明确数据类型,支持类型匹配。3)作用域不同:define全局有效,无作用域限制;const遵循变量作用域规则(局部、全局、类内)。4)内存占用:define不占用内存,仅文本替换;const常量会分配内存。5)调试性:define替换后无符号信息,调试困难;const可正常调试,可读性更好。4、inline内联函数的原理和优缺点?原理:编译阶段将内联函数的代码直接嵌入调用处,避免普通函数的调用、压栈、跳转、返回开销。优点:省去函数调用开销,提升小段高频代码的执行效率;相比宏函数,有类型检查、语法校验,更安全。缺点:会增加代码体积,每一处调用都会嵌入代码,冗余代码变多;大函数不适合内联,会导致程序体积膨胀。注意:inline只是编译器建议,编译器会自动判断是否真正内联,递归函数、复杂循环函数不会被内联。5、extern关键字作用?1)修饰变量/函数:声明外部变量或函数,告知编译器该变量、函数定义在其他文件,仅做声明,不分配内存。2)extern"C":解决C++函数名重载的名字改编问题,让C++代码可以调用C语言库函数,保证链接兼容。二、指针与引用核心面试题1、指针和引用的区别?(必考)1)定义本质:指针是存储变量地址的变量,独立占用内存;引用是变量的别名,和原变量共用同一块内存,不单独分配内存。2)初始化要求:指针可以不初始化,可置空;引用必须在定义时初始化,且一旦绑定,无法更换绑定对象。3)空值问题:指针可以为NULL;引用不存在空引用,必须绑定有效变量。4)使用方式:指针需要解引用*取值;引用直接使用,操作和原变量完全一致。5)多级支持:支持多级指针(二级、三级指针);不支持多级引用。6)地址获取:指针有独立地址;引用的地址和原变量地址完全相同。2、野指针是什么?如何避免野指针?野指针:指向未知、非法、已释放内存的指针,没有明确指向,不是空指针,无法通过判断NULL规避。产生场景:指针未初始化、指针指向的内存被free/delete后未置空、指针越界访问。规避方法:1)指针定义时直接初始化,要么指向有效地址,要么置NULL;2)内存释放后,立即将指针置NULL;3)严格控制数组、指针访问范围,避免越界;4)使用智能指针管理动态内存。3、空指针、野指针、悬空指针的区别?1)空指针:值为NULL,明确不指向任何内存,安全,可通过if判断规避;2)野指针:随机指向非法内存,无规律,风险最高;3)悬空指针:指针原本指向有效内存,内存被释放后,指针未置空,保留旧地址,属于失效指针。三、面向对象OOP核心面试题1、面向对象三大特性及原理?1)封装:将数据(成员变量)和行为(成员函数)封装在类中,隐藏内部细节,仅对外提供接口访问。作用是降低耦合、保护数据安全、方便代码维护。2)继承:子类复用父类的属性和方法,支持代码复用和层级扩展。分为公有、保护、私有继承,日常开发多用公有继承。3)多态:同一接口,不同对象表现不同行为。核心作用是接口统一、拓展性强,分为静态多态和动态多态。2、静态多态和动态多态的区别?1)静态多态(编译期多态):编译阶段确定函数调用地址,代表特性是函数重载、运算符重载。执行效率高,无运行时开销。2)动态多态(运行时多态):运行阶段根据对象实际类型确定调用函数,依赖虚函数、虚表实现。支持父子类接口重写,扩展性强,有微小运行时开销。3、虚函数原理?虚表、虚指针是什么?C++动态多态依靠虚函数表(vtable)和虚指针(vptr)实现:1)包含虚函数的类,编译器会自动生成一张虚函数表,存储所有虚函数的地址;2)该类的每个对象,都会自带一个虚指针,指向所属类的虚表;3)当父类指针指向子类对象时,运行时通过虚指针找到虚表,调用对应子类重写的函数,实现多态。注意:虚表属于类,全局唯一;虚指针属于对象,每个对象独立拥有。4、构造函数、析构函数能否为虚函数?1)构造函数不能是虚函数:构造对象时,需要先初始化虚指针、虚表,而虚表依赖对象初始化完成,顺序矛盾;且构造函数是创建对象,不存在多态调用场景。2)析构函数建议声明为虚函数:当父类指针指向子类对象,delete父类指针时,若析构非虚函数,只会调用父类析构,子类内存无法释放,造成内存泄漏;虚析构可以保证先调用子类析构,再调用父类析构,完整释放内存。5、重载和重写的区别?1)重载(Overload):同一作用域内,函数名相同、参数列表不同(个数、类型、顺序),返回值无要求。属于编译期多态。2)重写(Override):父子类不同作用域,子类函数与父类虚函数函数名、参数、返回值完全一致,子类覆盖父类实现。属于运行时多态。6、访问权限public、protected、private区别?1)public:公有,类内、类外、子类均可访问;2)protected:保护,类内、子类可访问,类外不可访问;3)private:私有,仅当前类内部可访问,子类、类外均不可访问。四、C++内存管理面试题1、C++内存分区详解?1)代码段:存放程序二进制指令,只读,运行期间不修改;2)全局/静态区:存放全局变量、static静态变量,程序启动分配、进程结束释放;3)栈区:存放局部变量、函数参数、返回地址,由系统自动分配释放,空间小、速度快,溢出会报栈溢出错误;4)堆区:动态内存,由new/malloc分配、delete/free手动释放,空间大、灵活,生命周期由开发者控制;5)常量区:存放字符串常量、const全局常量,只读不可修改。2、new和malloc的区别?1)所属语言:malloc/free是C语言库函数;new/delete是C++关键字;2)初始化:malloc只分配内存,不初始化;new分配内存后自动调用构造函数初始化对象;3)类型:malloc返回void*,需要强制类型转换;new直接返回对应类型指针,类型安全;4)异常处理:malloc失败返回NULL;new失败抛出bad_alloc异常;5)重载:new/delete支持重载,可自定义内存分配逻辑;malloc不支持重载。3、内存泄漏的原因及解决办法?内存泄漏:动态堆内存分配后,未手动释放,程序结束前内存无法回收,长期运行会导致内存占用越来越高。常见原因:new/malloc后无对应delete/free、异常跳转导致释放代码未执行、类成员内存未在析构释放、指针赋值覆盖导致原内存丢失。解决办法:1)手动配对使用new/delete、malloc/free;2)使用智能指针(shared_ptr、unique_ptr)自动管理内存;4)借助内存检测工具排查泄漏点。核心逻辑:在类的构造函数中申请资源(内存、文件句柄、锁),在析构函数中释放资源。对象生命周期由栈管理,对象销毁时自动释放资源,避免遗忘释放、资源泄漏。五、STL容器与算法高频题1、vector和list的区别及使用场景?1)底层结构:vector是动态数组,连续内存;list是双向链表,非连续内存。2)访问效率:vector支持随机访问,下标访问O(1);list仅支持遍历访问,访问O(n)。3)增删效率:vector尾部增删快,中间、头部增删需要移动元素,效率低;list任意位置增删仅需修改指针,效率高。4)内存特性:vector内存连续,会预留冗余空间,存在内存浪费;list每个节点独立,无内存冗余,但节点开销大。使用场景:-频繁查询、随机访问、尾部增删,用vector;-频繁中间、头部插入删除,极少查询,用list。2、map和unordered_map的区别?1)底层实现:map基于红黑树;unordered_map基于哈希表。2)有序性:map按键值升序有序存储;unordered_map无序存储。3)时间复杂度:map增删查O(logn);unordered_map平均O(1),最坏O(n)(哈希冲突)。4)性能:数据量大时unordered_map更快;map性能稳定,无最坏情况。5)内存:unordered_map哈希表存在冗余空间,内存占用更高。3、STL迭代器失效问题?如何解决?迭代器失效:容器元素增删、扩容后,原有迭代器指向的内存失效,再次使用会导致崩溃、乱码。1)vector:插入、删除、扩容都会导致迭代器失效;2)list/map:仅删除当前迭代器元素时,当前迭代器失效,其他迭代器有效;解决方式:每次修改容器后,重新获取迭代器;遍历删除时,使用容器自带的erase返回值更新迭代器。六、智能指针面试题1、unique_ptr、shared_ptr、weak_ptr区别?1)unique_ptr:独占式智能指针,同一时间仅一个指针管理资源,不支持拷贝,支持移动,开销最小,适合独占资源场景。2)shared_ptr:共享式智能指针,基于引用计数,支持多指针共享同一资源,计数为0时自动释放内存。存在循环引用问题。3)weak_ptr:弱引用指针,不增加引用计数,专门解决shared_ptr循环引用问题,无法直接解引用,需先提升为shared_ptr。2、什么是循环引用?如何解决?循环引用:两个对象互相持有对方的shared_ptr,导致双方引用计数永远无法归零,内存无法释放,造成内存泄漏。解决办法:将其中一方的shared_ptr改为weak_ptr,不参与引用计数累加,打破循环,保证资源正常释放。七、多线程与并发高频题1、线程和进程的区别?1)资源归属:进程是资源分配的最小单位,独立占有内存、文件资源;线程是调度执行的最小单位,共享所在进程的所有资源。2)开销:进程创建、销毁、切换开销极大;线程开销极小,切换速度快。3)独立性:进程相互独立,一个进程崩溃不影响其他进程;线程共享进程资源,一个线程崩溃会导致整个进程崩溃。4)通信方式:进程通信复杂(管道、socket、信号量);线程通信简单,直接读写共享变量即可。2、mutex、lock_guard、unique_lock区别?1)mutex:互斥锁基础类,提供lock、unlock原生加解锁方法,需要手动控制,容易遗漏解锁。3、死锁的四个必要条件及解决办法?死锁四大必要条件(必须同时满足):1)互斥条件:资源同一时间仅一个线程占用;2)请求保持:线程持有已有资源,同时请求新资源;3)不可剥夺:已持有资源不能被其他线程强制抢占;4)循环等待:多个线程互相持有对方需要的资源,形成闭环等待。解决思路:破坏任意一个条件即可避免死锁常用方案:统一锁的申请顺序、超时等待、减少锁嵌套、避免持有锁时请求其他资源。八、手撕代码高频简答(面试手写常考)1、写一个C++单例模式(懒汉+线程安全)cpp
classSingleton{
private:
staticSingleton*instance;
staticmutexmtx;
Singleton(){}
public:
staticSingleton*getInstance(){
if(instance==nullptr){
lock_guard<mutex>lock(mtx);
if(instance==nullptr){
instance=newSingleton();
}
}
re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国便利店饮料货架陈列优化与动销策略分析报告
- 《圆满人生财务》课件
- 2026年院感知识试题及答案
- 2026年院感防控知识考试题附答案
- 《大学新生的教育》课件
- 《开课人范金萍》课件
- 食品饮料公司生产条例
- 某食品集团供应链管理细则
- 《微积分第九版》课件
- 2026年预防艾梅乙项目培训试题(附答案)
- T∕JSCTS 71-2025 轨道交通自动扶梯健康监测技术规范
- 人工挖孔桩有限空间作业专项施工方案
- 2026年政府报告考试题及答案
- 初中八年级历史《伟大的历史转折:十一届三中全会与改革开放的开启》教学设计
- GB/T 470-2026锌锭
- 雨课堂学堂在线学堂云《中共中央延安十三年史(陕西师范)》单元测试考核答案
- 2026年中科创达试工程师岗位笔目真题(考试直接用)附答案详解
- 【英语】高一英语完形填空夹叙夹议解题技巧及经典题型及练习题(含答案)
- 北京市二中教育集团2025-2026学年七年级上学期月考语文试题(含答案)
- 气管切开吸痰护理宣教
- 2025国庆节中秋节双节特色实践作业(三)
评论
0/150
提交评论