1. 编译过程
回答:
C/C++的编译分为四个阶段:
- 预处理:处理
#include、#define等指令,生成.i文件。 - 编译:将预处理后的代码转换为汇编代码(
.s文件)。 - 汇编:将汇编代码转为机器码(目标文件
.o)。 - 链接:合并目标文件和库,解析符号引用,生成可执行文件。
解析:
- 预处理阶段会删除注释,展开宏和头文件。
- 编译阶段进行语法和语义检查,生成中间代码(如LLVM IR)。
- 链接分为静态链接(直接合并库代码)和动态链接(运行时加载)。
- 扩展:使用
gcc -save-temps可保留所有中间文件,便于调试。
2. enum 和 enum class
回答:
- 传统
enum:- 成员直接暴露在父作用域,可能引发命名冲突。
- 隐式转换为整型(如
int a = Color::RED)。
enum class(C++11):- 成员需通过作用域访问(
Color::RED)。 - 禁止隐式类型转换,需显式
static_cast。
- 成员需通过作用域访问(
解析:
enum class类型安全,避免隐式转换错误。- 扩展:可以为
enum class指定底层类型(enum class Color : uint8_t)。
3. enum 和 union
回答:
enum:定义一组整型常量,用于提高代码可读性。union:所有成员共享同一块内存,用于节省内存(如协议解析)。
解析:
union的大小由最大成员决定,同时只能有一个成员有效。- 风险:错误访问
union成员可能导致未定义行为。 - 扩展:C++中可用
variant(C++17)替代union,提供类型安全。
4. 类型转换
回答:C++支持四种显式转换:
static_cast:基本类型转换、父子类指针转换(无运行时检查)。dynamic_cast:多态类型向下转换(依赖RTTI,失败返回nullptr)。const_cast:移除const或volatile属性(慎用)。reinterpret_cast:低级别指针转换(如int*→char*)。
解析:
- 避免C风格强制转换(如
(int*)p),优先使用C++风格。 - 扩展:
dynamic_cast只能用于含虚函数的类(多态类型)。
5. 右值引用
回答:
- 右值:临时对象(如函数返回值、表达式结果)。
- 右值引用(
&&):用于移动语义(转移资源)和完美转发。 std::move:将左值强制转为右值引用。
解析:
- 移动语义:避免深拷贝,提升性能(如
vector的移动构造)。 - 扩展:
完美转发通过std::forward保留参数的左/右值属性。
6. C11特性
回答:常用C11特性:
- 多线程支持:
<threads.h>提供线程、互斥量接口。 - 泛型选择:
_Generic根据类型选择代码分支。 - 匿名结构体/联合:简化嵌套定义。
解析:
- C11的多线程库在功能上弱于C++的
<thread>,但跨平台兼容性好。 - 扩展:C11新增
_Static_assert用于编译期断言。
7. 重写(Override)与重载(Overload)
回答:
- 重载:同一作用域内同名函数,参数不同(返回类型无关)。
- 重写:派生类覆盖基类的虚函数(需
virtual和override)。
解析:
override关键字(C++11)明确表示重写,避免拼写错误。- 扩展:函数隐藏(无
virtual时)可能导致非预期的调用结果。
8. 野指针及避免方法
回答:
- 野指针:指向已释放内存或未初始化内存的指针。
- 避免方法:
- 初始化指针为
nullptr。 - 释放后立即置空。
- 使用智能指针(
unique_ptr、shared_ptr)。
- 初始化指针为
解析:
shared_ptr可能引发循环引用,需配合weak_ptr使用。- 扩展:工具检测(如Valgrind、ASan)可定位野指针问题。
9. 命名空间冲突
回答:
- 解决方式:
- 使用命名空间隔离代码(
namespace MyLib { ... })。 - 匿名命名空间限制作用域(仅当前文件可见)。
- 使用命名空间隔离代码(
解析:
using namespace std;可能导致标准库符号冲突。- 扩展:内联命名空间(C++11)用于版本控制。
10. 宏定义作用范围
回答:
- 宏从定义处生效,直到文件末尾或
#undef取消定义。 - 不受命名空间或代码块限制。
解析:
- 宏可能引发意外替换(如
#define min(a,b) ...)。 - 扩展:优先使用
constexpr(C++11)或内联函数替代宏。
11. 代码注释何时消失
回答:
注释在预处理阶段被删除,编译器处理的代码中不包含注释。
解析:
- 预处理后的文件(
.i)可通过gcc -E查看,确认注释已移除。
12. readelf分析ELF文件
回答:
- 常用命令:
- 查看文件头:
readelf -h <file> - 查看节区头:
readelf -S <file> - 查看符号表:
readelf -s <file> - 查看动态段:
readelf -d <file>
- 查看文件头:
解析:
- 文件头:包含ELF类型(可执行、共享库)、入口地址等信息。
- 符号表:用于定位未定义符号(如链接错误)。
- 扩展:结合
objdump反汇编(objdump -d)分析代码段。
总结:以上问题覆盖C++核心概念及底层原理,面试时需结合代码示例和实际场景解释,展现对技术的深入理解。
7464


&spm=1001.2101.3001.11974&articleId=147965723&d=1&t=3&u=d852a82647a2480da14dd5f8ab005209)

被折叠的 条评论
为什么被折叠?



