- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
C++面试核心题库及参考答案
一、基础语法与面向对象
1.说说C++和C的主要区别
参考答案:
编程范式:C是面向过程(结构化),C++兼容面向过程且支持面向对象(封装、继承、多态),还支持泛型编程(模板)。
核心特性:C++新增类、对象、虚函数、构造/析构函数、运算符重载、模板、STL等;C无这些特性,仅支持基本数据类型和指针。
内存管理:C依赖malloc/free手动管理,C++除兼容外,新增new/delete(会调用构造/析构函数),更安全。
类型检查:C++类型检查更严格(如void*不能直接赋值给其他指针),C相对宽松。
2.什么是多态?实现多态的原理是什么?
参考答案:
多态是指同一接口(如函数调用)在不同对象上表现出不同行为,分静态多态和动态多态:
静态多态(编译时多态):通过函数重载、运算符重载实现,编译期确定调用哪个函数(根据参数类型、个数匹配)。
动态多态(运行时多态):通过“虚函数+继承”实现,核心是虚函数表(vtable)和虚指针(vptr):
含有虚函数的类会生成一张虚函数表,存储类中所有虚函数的地址;
该类的对象会隐含一个虚指针(vptr),指向所属类的虚函数表;
子类继承父类后,会重写虚函数表(覆盖父类虚函数地址,新增子类虚函数);
当父类指针/引用指向子类对象时,调用虚函数会通过vptr找到子类的虚函数表,执行子类实现,实现动态绑定。
3.构造函数和析构函数的特点,能否是虚函数?
参考答案:
构造函数特点:与类名相同,无返回值,可重载(默认、带参、拷贝构造),对象创建时自动调用,用于初始化对象。
析构函数特点:类名前加~,无返回值、无参数(不可重载),对象销毁时自动调用,用于释放资源(如堆内存、文件句柄)。
构造函数不能是虚函数:因为对象创建时,vptr尚未初始化(虚函数依赖vptr),无法实现动态绑定;且构造函数是初始化对象的,子类构造时先调用父类构造,无需虚函数。
析构函数建议设为虚函数:若父类指针指向子类对象,销毁时若析构函数非虚,只会调用父类析构,导致子类资源泄漏;设为虚函数后,会通过vptr调用子类析构,再调用父类析构,确保资源完全释放。
二、内存管理
1.new/delete和malloc/free的区别
参考答案:
维度
new/delete
malloc/free
本质
C++运算符
C标准库函数
类型检查
需指定对象类型,类型安全
返回void*,需强制转换,无类型检查
内存分配
自动计算对象大小
需手动传入字节数
构造/析构
new调用构造函数,delete调用析构函数
仅分配/释放内存,不调用构造/析构
数组处理
支持数组(new[]/delete[]),自动匹配数组大小
需手动计算数组总字节数,释放时无特殊处理
异常处理
分配失败抛出bad_alloc异常
分配失败返回NULL
重载
可重载operatornew/delete
不可重载
2.什么是内存泄漏?常见场景及如何避免?
参考答案:
内存泄漏是指动态分配的内存(堆内存)使用后未释放,导致内存被持续占用,最终可能耗尽系统内存。
常见场景:
用new/malloc分配内存后,忘记调用delete/free;
异常抛出导致释放代码未执行(如new后抛异常,delete没机会调用);
指针重新赋值,原指向的堆内存丢失(如int*p=newint;p=newint;,第一个new的内存无法访问);
容器使用不当(如vector中存储指针,容器销毁时仅销毁指针本身,不释放指针指向的内存)。
避免方法:
尽量使用智能指针(unique_ptr、shared_ptr),自动管理内存(超出作用域自动释放);
遵循“谁分配谁释放”原则,明确内存释放责任;
避免裸指针直接管理堆内存,优先使用STL容器(如vector代替动态数组);
用RAII(资源获取即初始化)机制(如类封装资源,析构函数释放);
工具检测:使用Valgrind、VisualStudio内存诊断工具等排查泄漏。
3.智能指针的原理及分类(unique_ptr、shared_ptr、weak_ptr)
参考答案:
智能指针是C++11引入的模板类,本质是“封装裸指针的对象”,利用RAII机制,在对象析构时自动释放指向的堆内存,避免内存泄漏。
unique_ptr:
独占所有权:同一时间只能有一个unique_ptr指向对象,禁止拷贝(拷贝构造和赋值运算符被禁用),支持移动(std::move)。
场景:管理单个对象,无需共享所有权(如局部动态对象、函数返回动态对象)。
示例:std::unique_ptrintp(ne
原创力文档


文档评论(0)