C++大厂面试100题精讲:从内存管理到分布式系统,一网打尽
一、内存管理
-
虚函数实现原理
-
问题:写出示例代码说明动态多态的实现。
-
答案:通过虚函数表(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; }
-
-
智能指针与RAII
- 问题:shared_ptr和unique_ptr的核心区别是什么?
- 答案:unique_ptr独占所有权,不可复制,移动语义转移所有权;shared_ptr共享所有权,引用计数管理生命周期。需避免shared_ptr的循环引用问题,可使用weak_ptr解决。
-
动态内存分配问题
-
问题:以下代码有何问题?如何修正?
Cpp
int* arr = new int[10]; delete arr; // 错误点 -
答案:应使用
delete[]释放数组内存。修正后代码:Cpp
int* arr = new int[10]; delete[] arr;
-
二、面向对象编程
-
继承中的对象切片
- 问题:什么是对象切片?如何避免?
- 答案:切片发生在派生类对象赋值给基类对象时,派生类特有数据被“截断”。避免方法:使用基类指针或引用传递对象。
-
Lambda表达式
-
问题:lambda表达式的捕获列表有几种方式?以下代码输出什么?
Cpp
int x = 10; auto lambda = [x]() mutable { x++; std::cout << x; }; x = 20; lambda(); // 输出? -
答案:捕获方式有值捕获、引用捕获、混合捕获。输出为11,因为lambda表达式中捕获的x是副本,mutable允许修改副本,但外部x不受影响。
-
三、模板编程与STL
-
模板特化与偏特化
-
问题:写出模板类Calculator针对int类型的全特化版本。
-
答案:
Cpp
template <typename T> class Calculator { // 通用实现 }; template <> class Calculator<int> { // int类型的特殊实现 };
-
四、数据结构与算法
-
二叉树遍历
- 问题:描述二叉树的遍历方式及其实现。
- 答案:包括前序遍历、中序遍历、后序遍历和层次遍历。实现可通过递归或迭代方式。
-
快速排序
-
问题:请编写快速排序的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); }
-
五、并发编程
-
互斥锁
- 问题:解释互斥锁的概念及其使用方法。
- 答案:互斥锁用于保护共享资源,确保同一时间只有一个线程可以访问该资源。使用方法包括加锁(
std::lock_guard或std::unique_lock)、解锁和尝试加锁等。
六、分布式系统
-
负载均衡
- 问题:请解释负载均衡在分布式系统中的作用。
- 答案:负载均衡用于将请求均匀分配到多个服务器上,以提高系统的吞吐量和响应速度,同时避免单个服务器过载。
-
CAP定理
- 问题:请解释CAP定理及其在分布式系统中的应用。
- 答案:CAP定理指出,一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求。在实际应用中,需要根据具体场景权衡这三个要素。
以上仅为C++大厂面试100题中的部分精讲内容,涵盖了从内存管理、面向对象编程、模板编程与STL、数据结构与算法、并发编程到分布式系统等多个方面。准备面试时,建议全面复习相关知识,并结合实际项目进行练习和巩固。