第一部分:基础知识
- C++ 中的右值引用和左值引用有什么区别?它们在移动语义中的作用是什么?
- C++ 中的构造函数有哪几种类型?它们分别在什么时候调用?
- 什么是栈内存和堆内存?它们的使用场景及各自的优缺点是什么?
- C++ 中
inline
关键字的作用是什么?什么时候使用它? - 什么是未定义行为(undefined behavior)?举例说明几种常见的未定义行为。
第二部分:面向对象编程
- 什么是多态?如何在 C++ 中实现多态?
- C++ 中的构造函数、析构函数和拷贝构造函数有什么区别?
- 什么是虚函数?如何实现动态绑定?虚函数表(vtable)在多态中的作用是什么?
- 什么是接口类?如何在 C++ 中实现一个接口类?
- 解释菱形继承问题以及如何通过虚继承来避免它。
第三部分:STL
std::vector
与std::deque
的区别是什么?它们各自的优缺点是什么?- STL 中的迭代器失效是什么?在什么情况下迭代器会失效?如何避免?
std::map
和std::unordered_map
的底层实现有什么不同?各自的时间复杂度是多少?- 解释
std::shared_ptr
和std::unique_ptr
的区别。它们如何进行内存管理? - C++ 中的容器
std::priority_queue
是如何实现的?在什么情况下使用它?
第四部分:并发与多线程
- C++11 引入了哪些并发相关的库或特性?
std::thread
如何创建和管理线程?如何使用join()
和detach()
?- 什么是互斥锁(mutex)?C++ 中如何使用
std::mutex
保证线程安全? - 解释条件变量(
std::condition_variable
)的作用,并给出使用示例。 - 如何避免死锁?在多线程编程中有哪些常见的策略?
第五部分:C++ 高级特性
- 什么是 SFINAE?如何在模板编程中使用 SFINAE 来实现不同的行为?
- C++ 中的
constexpr
和const
有什么区别?在什么情况下应该使用constexpr
? - C++20 中的模块化(Modules)有什么特点?它相较于传统头文件机制有什么优势?
- 解释移动构造函数和移动赋值运算符的作用及其实现方法。
- C++ 中如何实现一个泛型函数?如何使用模板特化(template specialization)?
第六部分:现场编程
题目 1:实现一个线程安全的单例模式。
要求:
- 使用双重检查锁定(double-checked locking)来确保单例的线程安全性。
- 提供懒汉式(lazy initialization)单例创建。
题目 2:给定一个整型数组,编写一个函数,将数组中的元素反转,要求时间复杂度为 O(n),空间复杂度为 O(1)。
方法:双指针;类似翻转字符串;
答案: