C++ 面试核心指南
基础知识篇
一、基础语法与特性
1. C++ 与 C 的区别? C++ 在 C 的基础上扩展了面向对象特性(封装、继承、多态),引入了模板、STL 标准库以及异常处理机制,使得代码复用性和安全性更高。
2. 值传递、指针传递与引用传递?
- 值传递:拷贝一份副本,修改不影响原数据。
- 指针传递:传递地址,函数内可修改原数据,需手动管理内存。
- 引用传递:别名,语法更简洁,默认不可空且不能重新绑定。
3. const 的用法?
- 修饰变量:声明常量。
- 修饰指针:
const int* p指向常量,int* const p为常指针。 - 修饰成员函数:
void f() const;表示函数内不修改成员变量。
4. static 的作用?
- 局部静态变量:生命周期贯穿程序运行,函数调用间保持值。
- 全局/文件作用域:限制可见性,仅在当前文件内有效。
- 类成员:属于类而非对象,所有实例共享。
5. inline 内联函数的原理? 编译器用函数体替换调用点,消除函数调用开销。适用于小函数或频繁调用的场景,但过度使用会增加代码体积。
二、面向对象设计
1. C++ 四大特性? 封装、继承、多态、抽象。
2. 多态的实现方式?
- 静态多态:通过函数重载和模板实现,编译期绑定。
- 动态多态:通过虚函数实现,运行时绑定,依赖虚函数表。
3. 虚函数、纯虚函数与抽象类?
- 虚函数:子类可选择重写。
- 纯虚函数:
=0,子类必须实现。 - 抽象类:包含纯虚函数,不能直接实例化。
4. 虚函数表 (vtable) 工作原理? 当类含有虚函数时,编译器生成 vtable 存储函数指针。对象内部包含 vptr 指向该表,从而实现动态绑定。
5. 构造函数和析构函数顺序?
- 构造:基类 -> 成员对象 -> 派生类。
- 析构:派生类 -> 成员对象 -> 基类。
进阶实战篇
三、内存管理与 RAII
1. 内存分区? 栈(局部变量)、堆(new/delete)、全局/静态区、常量区、代码区。
2. new/delete 与 malloc/free?
new 分配内存并调用构造函数,返回类型安全指针;malloc 仅分配原始内存。对应地,delete 调用析构函数,free 仅释放内存。
3. 内存泄漏检测?
工具如 Valgrind、ASan 可辅助检测。最佳实践是使用智能指针(shared_ptr, unique_ptr)遵循 RAII 原则。
4. Rule of Five 与异常安全? 若定义了析构、拷贝/赋值/移动中的任意一个,通常需考虑全部五个函数。移动操作建议标注 ,以便 STL 容器在扩容时优先选择移动而非拷贝。

