如何通过C++面试:热门问题与答案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何通过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的核心特性之一。面试中可能会要求你编写移动构造函数或解释转发引用的概念。



问题: 什么是移动语义?为什么需要它?请举例说明其加速代码的场景。



答案: 移动语义允许在不复制的情况下转移资源(如动态内存)的所有权。我们通过"移动"指针来替代深拷贝,同时将源对象置为空。在处理大型容器时,这对性能至关重要。

博客

书籍推荐