C++面试题总结(三)
本辑涵盖引用与指针、堆栈溢出、虚函数、类型比较、宏定义、内存操作、位域、字节序、算法实现等常见考点。一、基础概念与语法1. 引用与指针的区别区别点引用指针初始化必须初始化可以不初始化(但易成野指针)可改变性初始化后不可改变指向可以随时改变指向空值不存在空引用可以指向空(NULL)语法直接使用,如同变量需要*解引用2. 堆栈溢出一般由什么原因导致?答:主要原因是**没有及时回收垃圾资源**(如动态内存未释放、递归过深等)。更准确地说,堆栈溢出常见于:(1).递归调用层次太深,栈帧累积(2).局部变量(尤其大数组)占用过多栈空间(3).内存泄漏导致堆耗尽,间接影响栈?3. 什么函数不能声明为虚函数?答:构造函数不能声明为虚函数。析构函数可以且常常声明为虚函数。4. 写出 float x 与“零值”比较的 if 语句const float EPSINON = 0.000001; if (x = -EPSINON x = EPSINON) { // x 为零 }注意:浮点数不能直接用 `==` 与 `0.0` 比较。5. 不能做 `switch()` 的参数类型是什么?答:`switch` 的参数不能为实型(浮点型),也不能为字符串。只能是整型、字符型、枚举型。6. 头文件中的 `#ifndef/#define/#endif` 有什么用?答:防止头文件被重复引用,是预处理指令。7. `#include filename.h` 与 `#include "filename.h"` 的区别`#include filename.h`:编译器从标准库路径开始搜索。`#include "filename.h"`:编译器从用户工作路径开始搜索。8. 为什么在 C++ 中调用 C 编译器编译的函数需要加 `extern "C"`?答:C++ 支持函数重载,编译时会生成修饰名(如 `_foo_int_int`),而 C 编译后符号为 `_foo`。`extern "C"` 告诉 C++ 编译器按照 C 的方式编译链接,以便正确调用 C 函数。9. 字符串数组与指针的比较char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout (str1 == str2) endl; // 0 cout