C++面试必备:200个关键问题解析

需积分: 24 14 下载量 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. **静态变量**:静态局部变量在函数调用间保持值,全局静态变量只初始化一次,静态成员变量属于类。