C++面试必备:200个关键问题解析
需积分: 24 4 浏览量
更新于2024-07-10
1
收藏 3.04MB PDF 举报
"Cpp面经200问.pdf" 是一本关于C++面试问题的集合,涵盖了许多核心概念和技术,适合准备C++面试的开发者学习。
1. **main执行前后**:在main函数执行之前,操作系统会进行初始化工作,如加载程序到内存,设置全局变量和静态变量的初始值等。main函数执行完毕后,通常会调用exit()函数,释放资源并终止程序。
2. **结构体内存对齐**:结构体成员的内存对齐是为了提高数据访问效率,确保每个成员按照特定的边界对齐,比如4字节或8字节对齐。编译器会在必要时在成员之间插入填充字节。
3. **指针和引用**:指针是一个变量,存储另一个变量的地址;引用是已存在的变量的别名,它不占内存,没有NULL状态,一旦引用被初始化就不能改变。
4. **堆和栈**:栈是自动分配和回收的内存区域,用于存储局部变量和函数参数;堆是程序员手动管理的内存,通过new和delete操作分配和释放。
5. **指针类型的区别**:包括普通指针、const指针、指针常量、const指针常量等,指针可以指向不同类型的数据,且可修改或不可修改。
6. **虚函数表和vptr**:虚函数表(vtable)存储了基类的虚函数地址,vptr是在对象创建时初始化的,指向对应的vtable,用于实现多态。
7. **new/delete与malloc/free**:new和delete是C++的内存管理操作,处理对象的构造和析构;malloc和free是C语言的内存管理,仅分配和释放内存,不涉及对象构造。
8. **new和delete实现**:new和delete是C++的运算符,它们通常会调用相应的分配器和析构函数来处理内存。
9. **malloc与new的区别**:new除了分配内存外,还会调用构造函数,而malloc只分配内存。
10. **宏定义和函数**:宏是预处理器替换,不遵循作用域规则,可能导致副作用;函数是运行时调用,有作用域,更安全。
11. **宏定义和typedef**:宏定义用于文本替换,typedef创建新的类型别名,不涉及语义替换。
12. **声明与定义**:声明告知编译器变量或函数的存在,定义分配实际内存或实现函数体。
13. **初始化成员列表**:非静态成员变量的初始化,特别是带有默认构造函数的类成员,以及const成员和引用必须在初始化列表中初始化。
14. **strlen和sizeof**:strlen计算字符串长度,不包括结束符'\0';sizeof计算变量或类型所占用的内存字节数。
15. **常量指针和指针常量**:前者是指向常量的指针,不能修改指针所指的值;后者是常量的指针,指针本身不可变,但可修改其指向的值。
16. **a和&a**:a是变量,&a是a的地址。
17. **数组名和指针**:数组名是指向数组首元素的指针,但不能改变数组名,即不能重新赋值。
18. **野指针和悬空指针**:野指针未初始化或已释放,指向未知内存;悬空指针是指向已释放内存的指针。
19. **迭代器失效**:容器操作如插入、删除可能导致迭代器失效。
20. **C和C++的区别**:C++支持面向对象编程,有类、模板、异常处理等特性,而C语言主要为过程式编程。
21. **C++与Java的区别**:C++支持底层编程,性能更高,而Java是跨平台的,有垃圾回收机制,安全性更好。
22. **struct和class**:C++中,struct默认所有成员public,class默认private;两者都可用于定义类。
23. **define宏定义和const**:宏定义是预处理器替换,const用于声明常量。
24. **const和static**:const修饰变量使其不可变,static修饰变量使其生命周期贯穿整个程序。
25. **顶层const和底层const**:顶层const修饰指针本身,底层const修饰指针所指对象。
26. **类的对象存储空间**:包括成员变量和成员函数(虚函数表),分配在栈或堆中。
27. **final和override**:final用于禁止子类覆盖方法,override用于明确表示覆盖父类方法。
28. **拷贝初始化和直接初始化**:拷贝初始化是通过等号完成,直接初始化是通过括号完成。
29. **初始化和赋值**:初始化是创建对象时赋予初值,赋值是对象创建后改变其值。
30. **extern"C"**:用于C++链接C库,保持兼容性。
31. **模板函数和模板类特例化**:特例化是为特定类型实例化模板,以满足特定需求。
32. **C和C++的类型安全**:C++提供了更多的类型检查和安全特性,如const、引用等。
33. **析构函数为虚函数**:为了在多态下正确销毁派生类对象,析构函数通常是虚函数。
34. **构造函数和析构函数虚函数**:构造函数不能是虚函数,析构函数可以是虚函数或纯虚函数。
35. **重载、覆盖和隐藏**:重载是同一作用域内不同参数列表的同名函数,覆盖是派生类对基类虚函数的新实现,隐藏是派生类中同名成员屏蔽基类成员。
36. **多态实现**:C++通过虚函数和动态绑定实现多态。
37. **构造函数种类**:默认构造函数、拷贝构造函数、移动构造函数、带参数构造函数等。
38. **浅拷贝和深拷贝**:浅拷贝只复制对象的引用或指针,可能导致两个对象共享同一资源;深拷贝则复制对象的所有内容。
39. **内联函数和宏定义**:内联函数避免函数调用开销,但可能导致代码膨胀,宏定义是预处理器替换,易引发副作用。
40. **构造函数、析构函数和虚函数内联**:可以声明为内联,但是否内联由编译器决定。
41. **auto、decltype和decltype(auto)**:auto自动推断类型,decltype根据表达式类型返回类型,decltype(auto)用于推断解引用或转换表达式的类型。
42. **访问控制**:public允许所有对象访问,protected允许本类和子类访问,private仅允许本类访问。
43. **判断大小端存储**:通过比较int类型的低字节和高字节在内存中的位置来判断。
44. **volatile、mutable和explicit**:volatile指示变量可能被外部因素改变,mutable允许const对象修改该成员,explicit禁止隐式类型转换。
45. **拷贝构造函数**:当一个对象被初始化为另一个已存在对象的副本时调用。
46. **C++的new种类**:包括普通new、new[]、placement new等。
47. **NULL和nullptr**:NULL是旧的指针零值,nullptr是C++11引入的类型安全的零指针。
48. **内存分区**:包括栈、堆、静态存储区和常量存储区。
49. **异常处理**:try-catch块用于捕获和处理运行时错误。
50. **static的用法**:静态成员属于类,而非类实例,静态局部变量在函数每次调用时保持值,全局静态变量只有一个实例。
51. **静态变量**:静态局部变量在函数调用间保持值,全局静态变量只初始化一次,静态成员变量属于类。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2019-07-11 上传
2020-06-22 上传
2021-08-31 上传
boombung
- 粉丝: 8
- 资源: 6
最新资源
- Leetcode-Exercises:Leetcode练习以提高编程能力
- 字母大小写转换算法:标题大小写,切换大小写
- PhoneNumber.js:phonenumber.js是一个JavaScript库,用于验证和格式化电话号码
- bowlpowl:用于创建简单的大学碗池跟踪网站PHP源代码-Source website php
- VSWE-Tutorials:在遵循 VSWE 的教程时使用的存储库
- 448916,c语言atof函数源码,c语言
- my-hugo-blog:我的雨果博客
- VacBanChecker:一个用于检查是否禁止蒸汽疏散的书签
- ANet:基于Redis网络模型的简易网络库,网络模块代码取自Redis原始代码
- WEB-ONE-ESQUELETO:具有纯文本标记语言的简单页面。 骨架设计!
- PHP-Website:此存储库是主题开源技术学术分配的一部分-Source website php
- C#-Leetcode编程题解之第16题最接近的三数之和.zip
- rxc:C 的React式扩展
- montita11:项目
- mwave:可以显示音频波形的音乐播放器
- updatecsswithjspractice