C++大厂面试真题宝典 精选100道

174 阅读3分钟

C++大厂面试100题精讲:从内存管理到分布式系统,一网打尽

一、内存管理

  1. 虚函数实现原理

    • 问题:写出示例代码说明动态多态的实现。

    • 答案:通过虚函数表(vtable)和虚表指针(vptr)实现。基类中包含虚函数表指针,指向虚函数表,派生类重写虚函数后,虚函数表中相应地址会被替换为派生类的函数地址。示例代码:

      Cpp

      class Base {
      public:
          virtual void func() { std::cout << "Base"; }
      };
      
      class Derived : public Base {
      public:
          void func() override { std::cout << "Derived"; }
      };
      
      int main() {
          Base* obj = new Derived();
          obj->func(); // 输出 "Derived"
          delete obj;
          return 0;
      }
      
  2. 智能指针与RAII

    • 问题:shared_ptr和unique_ptr的核心区别是什么?
    • 答案:unique_ptr独占所有权,不可复制,移动语义转移所有权;shared_ptr共享所有权,引用计数管理生命周期。需避免shared_ptr的循环引用问题,可使用weak_ptr解决。
  3. 动态内存分配问题

    • 问题:以下代码有何问题?如何修正?

      Cpp

      int* arr = new int[10];
      delete arr; // 错误点
      
    • 答案:应使用delete[]释放数组内存。修正后代码:

      Cpp

      int* arr = new int[10];
      delete[] arr;
      

二、面向对象编程

  1. 继承中的对象切片

    • 问题:什么是对象切片?如何避免?
    • 答案:切片发生在派生类对象赋值给基类对象时,派生类特有数据被“截断”。避免方法:使用基类指针或引用传递对象。
  2. Lambda表达式

    • 问题:lambda表达式的捕获列表有几种方式?以下代码输出什么?

      Cpp

      int x = 10;
      auto lambda = [x]() mutable { x++; std::cout << x; };
      x = 20;
      lambda(); // 输出?
      
    • 答案:捕获方式有值捕获、引用捕获、混合捕获。输出为11,因为lambda表达式中捕获的x是副本,mutable允许修改副本,但外部x不受影响。

三、模板编程与STL

  1. 模板特化与偏特化

    • 问题:写出模板类Calculator针对int类型的全特化版本。

    • 答案

      Cpp

      template <typename T>
      class Calculator {
          // 通用实现
      };
      
      template <>
      class Calculator<int> {
          // int类型的特殊实现
      };
      

四、数据结构与算法

  1. 二叉树遍历

    • 问题:描述二叉树的遍历方式及其实现。
    • 答案:包括前序遍历、中序遍历、后序遍历和层次遍历。实现可通过递归或迭代方式。
  2. 快速排序

    • 问题:请编写快速排序的C++代码。

    • 答案

      Cpp

      void quickSort(int arr[], int low, int high) {
          if (low < high) {
              int pi = partition(arr, low, high);
              quickSort(arr, low, pi - 1);
              quickSort(arr, pi + 1, high);
          }
      }
      
      int partition(int arr[], int low, int high) {
          int pivot = arr[high];
          int i = (low - 1);
          for (int j = low; j <= high - 1; j++) {
              if (arr[j] < pivot) {
                  i++;
                  std::swap(arr[i], arr[j]);
              }
          }
          std::swap(arr[i + 1], arr[high]);
          return (i + 1);
      }
      

五、并发编程

  1. 互斥锁

    • 问题:解释互斥锁的概念及其使用方法。
    • 答案:互斥锁用于保护共享资源,确保同一时间只有一个线程可以访问该资源。使用方法包括加锁(std::lock_guardstd::unique_lock)、解锁和尝试加锁等。

六、分布式系统

  1. 负载均衡

    • 问题:请解释负载均衡在分布式系统中的作用。
    • 答案:负载均衡用于将请求均匀分配到多个服务器上,以提高系统的吞吐量和响应速度,同时避免单个服务器过载。
  2. CAP定理

    • 问题:请解释CAP定理及其在分布式系统中的应用。
    • 答案:CAP定理指出,一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求。在实际应用中,需要根据具体场景权衡这三个要素。

以上仅为C++大厂面试100题中的部分精讲内容,涵盖了从内存管理、面向对象编程、模板编程与STL、数据结构与算法、并发编程到分布式系统等多个方面。准备面试时,建议全面复习相关知识,并结合实际项目进行练习和巩固。