C++面试题
1. 问题:`volatile` 关键字的作用是什么?
答案:`volatile` 关键字用于指示编译器不应优化对变量的访问,适用于多线程或中断处理程序中的变量。
2. 问题:`static` 关键字的作用是什么?
答案:`static` 关键字用于保持变量在程序的生命周期内保持其值,或者限制变量的作用域。
3. 问题:`extern` 关键字的作用是什么?
答案:`extern` 关键字用于声明全局变量或函数,但不定义它们,可以在其他文件中使用。
4. 问题:`const` 关键字的作用是什么?
答案:`const` 关键字用于声明常量,防止其值被修改。
5. 问题:`const` 关键字适用于哪些情况?
答案:`const` 关键字适用于需要保护不被修改的数据。
6. 问题:`new/delete` 和 `malloc/free` 有什么区别?
答案:`new/delete` 用于动态内存分配和释放,并调用构造和析构函数,而 `malloc/free` 只是分配和释放内存。
7. 问题:`strlen("\0")` 和 `sizeof("\0")` 的值分别是多少?
答案:`strlen("\0")` 的值是0,因为它返回字符串的长度,不包括空字符。`sizeof("\0")` 的值是1,因为它返回字符串的大小,包括空字符。
8. 问题:结构体和联合体有什么区别?
答案:结构体的所有成员共享内存空间,而联合体的成员共享同一块内存空间。
9. 问题:左值和右值是什么?
答案:左值是可寻址的内存位置,右值是不可寻址的临时值。
10. 问题:什么是短路求值?
答案:短路求值是逻辑运算中的一种优化方式,只有在必要时才对右侧表达式进行求值。
30. 什么是++a和a++的区别?
++a会先将a的值加1,然后返回增加后的值;而a++会先返回a的值,然后再将a的值加1。
31. #define和typedef的区别是什么?
#define用于创建宏定义,而typedef用于为已有类型定义新的名称。
32. C语言是如何进行函数调用的?
C语言进行函数调用时,会将函数参数压入栈中,然后跳转到函数的入口地址执行函数体。
33. C语言中内存分配的方式有哪些?
C语言中内存分配的方式包括静态内存分配、栈内存分配和堆内存分配。
34. 堆和栈有什么区别?
堆和栈的主要区别在于存储方式和生命周期,堆是动态分配的内存,生命周期由程序员管理;而栈是自动分配的内存,生命周期与函数调用相关。
35. 栈的用途是什么?
栈用于存储局部变量、函数参数、函数调用信息等数据,以及用于函数调用的执行上下文。
36. 压栈的顺序是什么?
压栈的顺序是先进后出(FILO),即最后压入栈的元素最先被弹出。
37. C++中的内存管理是如何实现的?
C++中的内存管理通过new和delete操作符来动态分配和释放内存,以及使用智能指针来管理资源。
38. 什么是内存泄漏?
内存泄漏指的是程序中分配的内存未被正确释放,导致程序运行时消耗的内存不断增加,最终可能导致系统资源耗尽。
39. 数组指针和指针数组有什么区别?
数组指针是指指向数组的指针,而指针数组是指存储指针的数组。
40. 函数指针和指针函数有什么区别?
函数指针是指指向函数的指针,而指针函数是指返回指针的函数。
41. 数组名和指针有什么区别?
数组名是数组的地址,而指针是一个指向内存地址的变量。
42. 指针常量、常量指针、指向常量的常量指针分别是什么?
指针常量是指指针本身是常量,指针所指向的值可以修改;常量指针是指指针所指向的值是常量,指针本身的值可以修改;指向常量的常量指针是指指针本身是常量,指针所指向的值也是常量。
43. 指针和引用有什么区别?
指针是一个变量,存储的是一个地址;而引用是已定义变量的别名,与原变量共享存储空间。
44. 什么是野指针?
野指针是指指向未知内存地址的指针,使用野指针可能导致程序崩溃或产生未定义行为。
45. C++中的智能指针是什么?
C++中的智能指针是一种RAII(资源获取即初始化)的设计模式,用于管理动态分配的内存,可以自动释放所管理的资源,从而避免内存泄漏的发生。