如何通过C++面试:从A到Z的热门问题
C++开发人员职位的面试,不仅考察对语法的掌握,还考察对编译器工作原理、内存管理以及面向对象编程特性的深入理解。本文整理了面试中最常问到的从A到Z的热门问题。无论你是初级开发者,还是正在为中级水平做准备,这份材料都将对你有所帮助。
1. 基础语法与数据类型
我们从基础开始——考察你对C++基本概念理解的问题。
1.1. 引用和指针有什么区别?
这是一个经典问题。主要区别如下:
- 引用不能是
nullptr,而指针可以。 - 引用在初始化后不能重新绑定到另一个对象。
- 指针支持算术运算,而引用不支持。
int a = 5;int& ref = a; // 引用int* ptr = &a; // 指针
ref = 10; // a = 10*ptr = 20; // a = 201.2. 什么是 const,如何正确使用它?
在C++中,const 用于保护数据不被修改。区分 const 放在类型之前和之后很重要:
const int* ptr— 指向常量整数的指针(不能修改地址指向的值)。int* const ptr— 指向整数的常量指针(不能修改地址)。
2. 面向对象编程 (OOP)
面向对象编程相关问题是C++面试的必考部分。我们来分析关键主题。
2.1. 虚函数与多态
虚函数实现了后期绑定(动态多态)。示例:
class Base {public: virtual void show() { std::cout << "Base"; } virtual ~Base() = default;};
class Derived : public Base {public: void show() override { std::cout << "Derived"; }};
int main() { Base* b = new Derived(); b->show(); // 输出 "Derived" delete b;}务必记住虚析构函数——如果没有它,通过基类指针删除对象时,只会调用基类的析构函数,从而导致内存泄漏。
2.2. 纯虚函数与抽象类
包含至少一个纯虚函数(= 0)的类成为抽象类。不能创建该类的实例——只能创建实现了所有纯虚方法的子类实例。
2.3. 什么是vtable和vptr?
为了实现多态,编译器会为每个包含虚函数的类创建一个虚函数表(vtable)。每个对象都包含一个指向该表的隐藏指针(vptr)。虚函数的调用通过vptr间接进行,这会带来一些微小的额外开销。
3. 内存管理与智能指针
C++赋予开发者对内存的完全控制权,这需要格外小心。
3.1. new/delete 与 malloc/free 的区别
malloc分配内存,但不调用构造函数。free释放内存,但不调用析构函数。new分配内存并调用构造函数。delete调用析构函数并释放内存。
3.2. 智能指针:unique_ptr, shared_ptr, weak_ptr
智能指针自动管理对象的生命周期。关键点:
std::unique_ptr— 独占所有权,不可复制,只能移动。std::shared_ptr— 通过引用计数实现共享所有权。std::weak_ptr— 不增加引用计数,并