一、C++基础概念面试题
1. C++与C语言的主要区别是什么?
C++作为C语言的超集,引入了多项重要特性:
- 面向对象编程:支持类、继承、多态等OOP特性
- 模板编程:泛型编程能力
- 异常处理:try-catch机制
- 标准模板库(STL):提供丰富的数据结构和算法
- 命名空间:解决命名冲突问题
- 引用类型:作为变量的别名
- 函数重载:允许同名函数不同参数
2. 解释const关键字的多种用法
const在C++中有多种应用场景:
cpp
const int a = 10; // 常量变量
int const ptr = &a; // 指向常量的指针
int const ptr = &b; // 常量指针
const int& ref = a; // 常量引用
void func() const; // 成员函数不修改对象状态
const MyClass obj; // 常量对象
3. static关键字在C++中的作用
static在不同上下文中有不同含义:
- 局部变量:保持生命周期直到程序结束
- 全局变量/函数:限制作用域在当前文件
- 类成员变量:所有类实例共享
- 类成员函数:不依赖特定对象实例
二、面向对象编程面试重点
1. 解释C++中的多态实现机制
C++通过虚函数实现运行时多态:
cpp
class ba
public:
virtual void show() { cout << ba
virtual ~ba
};
class Derived : public ba 虚函数通过虚函数表(vtable)实现,每个包含虚函数的类都有一个vtable,存储指向实际函数的指针。 2. 构造函数和析构函数的调用顺序 继承体系中的构造/析构顺序: 3. 深拷贝与浅拷贝的区别 cpp // 深拷贝 三、内存管理相关面试题 1. new/delete与malloc/free的区别 | 特性 | new/delete | malloc/free | 2. 智能指针及其使用场景 C++11引入的智能指针: - shared_ptr:引用计数共享所有权 - weak_ptr:解决shared_ptr循环引用问题 3. 内存泄漏检测方法 常见内存泄漏检测手段: 四、STL与模板编程问题 1. vector的底层实现与扩容机制 vector使用动态数组实现,扩容策略: 2. map与unordered_map的比较 | 特性 | map | unordered_map | 3. 模板特化与偏特化 cpp // 全特化 // 偏特化 五、高级特性与性能优化 1. 移动语义与完美转发 C++11引入的重要特性: // 完美转发 2. 虚函数性能优化技巧 - 将频繁调用的虚函数声明为final class Derived : public ba 3. 缓存友好的代码设计 - 优化数据结构布局(结构体对齐、紧凑存储) 六、实际编程问题与解决方案 1. 实现线程安全的单例模式 cpp Singleton() = default; public:
public:
void show() override { cout
- 构造顺序:基类→成员对象→派生类
- 析构顺序:派生类→成员对象→基类
class String {
char data;
public:
// 浅拷贝(默认拷贝构造函数)
String(const String& other) : data(other.data) {}
String(const String& other) {
data = new char[strlen(other.data)+1];
strcpy(data, other.data);
}
};
|------------|---------------------|--------------------|
| 语言 | C++运算符 | C库函数 |
| 构造/析构 | 调用构造函数/析构函数 | 不调用 |
| 类型安全 | 是 | 否 |
| 内存不足 | 抛出bad_alloc | 返回NULL |
| 重载 | 可以重载 | 不可重载 |
- unique_ptr:独占所有权,不可复制
cpp
std::unique_ptr ptr(new MyClass());
cpp
std::shared_ptr ptr1 = std::make_shared();
auto ptr2 = ptr1; // 引用计数+1
- 使用Valgrind工具
- 重载new/delete记录分配释放
- 使用智能指针替代裸指针
- Windows平台使用CRT调试堆
- 初始容量为0
- 首次插入时分配最小容量(通常为1)
- 后续每次扩容为当前容量的2倍(或1.5倍)
- 扩容时需要分配新内存并拷贝元素
|--------------|----------------------|---------------------|
| 底层实现 | 红黑树 | 哈希表 |
| 查找复杂度 | O(log n) | O(1) |
| 元素顺序 | 按键值排序 | 无序 |
| 内存占用 | 较低 | 较高 |
| 适用场景 | 需要有序访问 | 快速查找 |
// 主模板
template
class MyVector { /.../ };
template
class MyVector { /.../ };
template
class MyVector { /.../ };
cpp
// 移动构造函数
MyClass(MyClass&& other) noexcept
: data(other.data) {
other.data = nullptr;
}
template
void emplace(Args&&... args) {
container.emplace_back(std::forward(args)...);
}
- 使用CRTP(奇异递归模板模式)实现编译时多态
cpp
template
class ba
public:
void interface() {
static_cast(this)->implementation();
}
};
public:
void implementation();
};
- 顺序访问内存(避免随机访问)
- 使用SOA(Structure of Arrays)代替AOS(Array of Structures)
- 减少缓存行污染
class Singleton {
private:
static std::atomic instance;
static std::mutex mtx;
static Singleton getInstance() {
Singleton tmp = instance.load(std::memory_order_relaxed);
std::atomic_thread_fence