- 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++面试高频题目及参考答案
一、基础语法与数据类型(3题)
1.题目:const和constexpr的区别是什么?实际开发中怎么选择使用?
参考答案:
核心区别在“编译期确定”和“使用场景”:
const修饰的变量是“只读变量”,编译时不一定确定值(比如constinta=rand();是合法的,运行时赋值),可用于修饰函数参数、类成员变量、局部变量等,主要作用是限制修改。
constexpr修饰的是“编译期常量”,必须在编译时就能计算出确定值(比如constexprintb=1+2;),可用于变量、函数、构造函数,核心是支持编译期计算,提升性能(避免运行时开销)。
实际选择:
若变量的值需要在运行时确定(比如用户输入、动态计算),用const;
若变量的值是固定的(比如数学常量π、数组长度),用constexpr,能让编译器做更多优化(比如直接替换为字面量)。
2.题目:C++中引用()和指针(*)的核心区别,举2个实际使用场景说明选择逻辑
参考答案:
核心区别有3点:
引用必须初始化且不能改指向(绑定后终身指向同一对象),指针可空、可改指向;
引用无空引用(语法上不允许),指针有野指针、空指针风险;
引用本质是变量的“别名”(编译器通常优化为指针实现,但语法上无指针操作),指针是存储地址的变量。
使用场景:
函数参数传递:若要传递大型对象(比如std::string、自定义类实例),用引用(constT)避免拷贝,且无空指针风险;若参数可能为空,用指针(constT*),比如voidprint(constchar*str),允许传入nullptr并在函数内判断。
类成员变量:若成员变量必须与外部对象绑定且终身不变,用引用(比如classA{private:intref;public:A(intx):ref(x){}});若需要动态切换指向的对象,用指针(比如classB{private:int*ptr;public:voidsetPtr(int*x){ptr=x;}})。
3.题目:sizeof(string)的结果是什么?为什么和字符串长度无关?
参考答案:
sizeof(string)的结果是字符串对象的“自身大小”,而非字符串内容的长度,不同编译器(VS、GCC)结果可能不同(通常是32字节或40字节),与字符串长度无关。
原因:
string是C++标准库的类,内部存储逻辑是“指针+长度信息”:对象本身不存储字符串字符,只存储指向堆内存的指针(存储字符数据)、字符串长度(size)、容量(capacity)等元信息。无论字符串是1个字符还是1000个字符,这些元信息的大小是固定的,所以sizeof(string)是固定值,而字符串内容的长度需要用size()或length()方法获取。
二、内存管理(4题)
1.题目:new/delete和malloc/free的区别,为什么C++不建议混用?
参考答案:
核心区别在“面向对象支持”和“使用逻辑”:
维度
new/delete
malloc/free
本质
运算符(语言层面特性)
标准库函数(C库提供)
类型安全
自动匹配类型,无需强制转换
返回void*,需手动强转
构造/析构
new调用构造函数,delete调用析构函数
仅分配/释放内存,不处理对象生命周期
内存失败处理
抛出bad_alloc异常
返回NULL指针
不建议混用的原因:
若用malloc分配内存后,用delete释放:malloc未调用构造函数,delete却尝试调用析构函数,可能导致内存泄漏或崩溃(比如对象内部有堆内存成员时);
若用new分配内存后,用free释放:new调用了构造函数(可能在堆上分配了额外内存),free仅释放原始内存,不调用析构函数,会导致对象内部的堆内存泄漏。
2.题目:什么是内存泄漏?举3个实际开发中常见的内存泄漏场景,怎么避免?
参考答案:
内存泄漏是指“已分配的堆内存不再被程序使用,但未被释放,导致系统内存被持续占用”,最终可能导致程序崩溃。
常见场景:
动态分配内存后忘记释放:比如int*p=newint[10];后,未写delete[]p;;
异常导致释放代码未执行:比如voidfunc(){int*p=newint;throw1;deletep;},抛出异常后delete未执行;
容器存储指针但未释放元素:比如vectorint*vec;
原创力文档


文档评论(0)