如何通过C++面试:热门问题详解与示例
C++开发者面试不仅考查语法知识,更要检验对内存、编译器及标准库工作机制的深刻理解。本文将解析2024-2025年面试中最常见的问题。你不仅会获得正确答案,还能看到代码示例,助你自信通过技术面试。
1. 虚函数与多态
这是经典考点。面试官希望确认你理解静态绑定与动态绑定的区别,以及虚函数表(vtable)的机制。
问题: 在构造函数或析构函数中调用虚函数会发生什么?
答案: 在基类构造函数中调用虚函数不会产生多态行为。调用基类构造函数时,派生类对象尚未创建完成,因此会调用基类版本的函数。析构函数同理——派生类析构函数调用后,对象会被"降级"为基类对象。
#include <iostream>
class Base {public: Base() { print(); } // 在构造函数中调用虚函数 virtual void print() { std::cout << "Base"; } virtual ~Base() = default;};
class Derived : public Base {public: Derived() { print(); } void print() override { std::cout << "Derived"; }};
int main() { Derived d; // 输出: Base (来自基类构造函数) // Derived (来自派生类构造函数) return 0;}2. 智能指针
现代面试必考话题。智能指针是C++中RAII和资源管理的基础。
问题: std::unique_ptr、std::shared_ptr和std::weak_ptr有什么区别?各自适用于什么场景?
答案:
- unique_ptr — 独占所有权。不可拷贝,只能移动。适用于资源应在离开作用域时释放的场景。
- shared_ptr — 共享所有权。使用引用计数。当计数归零时删除对象。
- weak_ptr — shared_ptr的"观察者"。不增加引用计数。用于防止循环依赖。
#include <memory>#include <iostream>
class Resource {public: Resource() { std::cout << "Resource acquired"; } ~Resource() { std::cout << "Resource released"; }};
int main() { // unique_ptr std::unique_ptr<Resource> uptr = std::make_unique<Resource>(); // shared_ptr std::shared_ptr<Resource> sptr1 = std::make_shared<Resource>(); std::shared_ptr<Resource> sptr2 = sptr1; // 引用计数 = 2 // weak_ptr std::weak_ptr<Resource> wptr = sptr1; // 不增加引用计数 if (auto locked = wptr.lock()) { std::cout << "Resource is still alive"; } return 0;}3. 移动语义与右值引用
移动语义是C++11的核心特性之一。面试中可能会要求你编写移动构造函数或解释转发引用的概念。
问题: 什么是移动语义?为什么需要它?请举例说明其加速代码的场景。
答案: 移动语义允许在不复制的情况下转移资源(如动态内存)的所有权。我们通过"移动"指针来替代深拷贝,同时将源对象置为空。在处理大型容器时,这对性能至关重要。