- 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++面试题库及答案
一、基础概念题
问:C++和C的核心区别是什么?实际开发中怎么选?
答:核心区别在面向对象特性(C++有类、继承、多态,C是面向过程)、类型安全(C++有引用、const,C靠指针)、标准库(C++有STL,C只有基础库)。选的话,做底层驱动、嵌入式(内存紧张、需直接操作硬件)用C;做复杂业务(比如客户端软件、后端服务)用C++,因为OOP能降低代码耦合,STL还能省开发时间。比如做一个工业控制的传感器读取模块用C,做一个带UI的数据分析软件用C++。
问:const修饰变量、指针、函数时,分别代表什么意思?举个容易踩坑的例子。
答:修饰变量是“值不能改”(比如constinta=5;a=6会报错);修饰指针分两种——constint*p是“指针指向的值不能改”,int*constp是“指针本身不能改指向”;修饰成员函数是“函数不修改类的成员变量”(比如classA{voidfunc()const;})。踩坑例子:用constint*p指向一个普通int变量,然后想通过*(int*)p改值,虽然编译可能过,但属于未定义行为,实际运行可能崩,尤其在多线程场景下。
问:函数重载和函数覆盖的区别?覆盖为什么必须满足“三同”(函数名、参数列表、返回值)?
答:重载是“同一作用域,同名不同参”(比如voidadd(inta)和voidadd(inta,intb)),编译时根据参数匹配;覆盖是“子类重写父类的虚函数”,运行时根据对象类型匹配。覆盖要“三同”,因为编译器要通过函数签名(名+参+返回值)找到对应的虚函数表条目,少一个不同就成了子类新函数,不是覆盖了。比如父类virtualvoidshow(),子类voidshow(inta)就不是覆盖,是重载。
二、内存管理题
问:new/delete和malloc/free的区别?为什么不能混用(比如new分配的内存用free释放)?
答:区别有三点:①new会调用构造函数,delete调用析构函数(malloc/free只管内存分配释放,不管对象初始化和资源清理);②new返回对应类型指针(不用强转),malloc返回void*(必须强转);③new失败抛bad_alloc异常,malloc失败返回NULL。混用会崩,比如用new创建一个类对象(会调用构造函数初始化成员),再用free释放,free不会调用析构函数,类里如果有动态内存(比如成员是char*),就会内存泄漏;反过来malloc分配的内存用delete释放,delete会试图调用析构函数,但这块内存根本不是对象,会触发内存错误。
问:什么是内存泄漏?怎么检测和避免?举个实际项目中的例子。
答:内存泄漏是“分配的内存没释放,程序运行中内存越用越多,最后崩掉”。检测工具常用Valgrind(Linux下)、VisualLeakDetector(Windows下),比如用Valgrind的memcheck工具,跑程序后会显示泄漏的内存地址和调用栈。避免的话,优先用智能指针(unique_ptr、shared_ptr),少手动new/delete;写类时注意析构函数释放资源。例子:项目里写一个日志类,构造函数里new了一个char[]存日志路径,析构函数忘了delete,每次创建日志对象就漏一块内存,跑几天程序就内存溢出了。
问:智能指针unique_ptr、shared_ptr、weak_ptr的区别和使用场景?
答:①unique_ptr:“独占所有权”,一个对象只能有一个unique_ptr指向它,不能拷贝(能移动),适合管理单个对象(比如局部的动态数组),场景:函数里创建一个临时的动态对象,用完自动释放,比如unique_ptrint[]arr(newint[10]);②shared_ptr:“共享所有权”,多个shared_ptr指向同一个对象,引用计数为0时释放,适合多模块共享对象(比如多个函数都要访问同一个配置对象),但要注意避免循环引用(比如A里有shared_ptr,B里有shared_ptr,会导致引用计数永远不为0,内存泄漏);③weak_ptr:“弱引用”,不增加引用计数,专门解决shared_ptr的循环引用,场景:比如A和B互相引用时,把其中一个改成weak_ptr,比如A里有shared_ptr,B里有weak_ptr,这样A的引用计数不会被B的指针
文档评论(0)