电话:15190038649
关闭
您当前的位置:首页 > 职场资讯 > 职业指导

C++面试全攻略:从基础到高级的常见问题解析

来源:灌南人才网 时间:2025-04-01 作者:灌南人才网 浏览量:

一、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 base {
public:
virtual void show() { cout << basen; }
virtual ~base() {} // 虚析构函数
};

class Derived : public base {
public:
void show() override { cout

虚函数通过虚函数表(vtable)实现,每个包含虚函数的类都有一个vtable,存储指向实际函数的指针。

2. 构造函数和析构函数的调用顺序

继承体系中的构造/析构顺序:
- 构造顺序:基类→成员对象→派生类
- 析构顺序:派生类→成员对象→基类

3. 深拷贝与浅拷贝的区别

cpp
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);
}
};

三、内存管理相关面试题

1. new/delete与malloc/free的区别

| 特性 | new/delete | malloc/free |
|------------|---------------------|--------------------|
| 语言 | C++运算符 | C库函数 |
| 构造/析构 | 调用构造函数/析构函数 | 不调用 |
| 类型安全 | 是 | 否 |
| 内存不足 | 抛出bad_alloc | 返回NULL |
| 重载 | 可以重载 | 不可重载 |

2. 智能指针及其使用场景

C++11引入的智能指针:
- unique_ptr:独占所有权,不可复制
cpp
std::unique_ptr ptr(new MyClass());

- shared_ptr:引用计数共享所有权
cpp
std::shared_ptr ptr1 = std::make_shared();
auto ptr2 = ptr1; // 引用计数+1

- weak_ptr:解决shared_ptr循环引用问题

3. 内存泄漏检测方法

常见内存泄漏检测手段:
- 使用Valgrind工具
- 重载new/delete记录分配释放
- 使用智能指针替代裸指针
- Windows平台使用CRT调试堆

四、STL与模板编程问题

1. vector的底层实现与扩容机制

vector使用动态数组实现,扩容策略:
- 初始容量为0
- 首次插入时分配最小容量(通常为1)
- 后续每次扩容为当前容量的2倍(或1.5倍)
- 扩容时需要分配新内存并拷贝元素

2. map与unordered_map的比较

| 特性 | map | unordered_map |
|--------------|----------------------|---------------------|
| 底层实现 | 红黑树 | 哈希表 |
| 查找复杂度 | O(log n) | O(1) |
| 元素顺序 | 按键值排序 | 无序 |
| 内存占用 | 较低 | 较高 |
| 适用场景 | 需要有序访问 | 快速查找 |

3. 模板特化与偏特化

cpp
// 主模板
template
class MyVector { /.../ };

// 全特化
template
class MyVector { /.../ };

// 偏特化
template
class MyVector { /.../ };

五、高级特性与性能优化

1. 移动语义与完美转发

C++11引入的重要特性:
cpp
// 移动构造函数
MyClass(MyClass&& other) noexcept
: data(other.data) {
other.data = nullptr;
}

// 完美转发
template
void emplace(Args&&... args) {
container.emplace_back(std::forward(args)...);
}

2. 虚函数性能优化技巧

- 将频繁调用的虚函数声明为final
- 使用CRTP(奇异递归模板模式)实现编译时多态
cpp
template
class base {
public:
void interface() {
static_cast(this)->implementation();
}
};

class Derived : public base {
public:
void implementation();
};

3. 缓存友好的代码设计

- 优化数据结构布局(结构体对齐、紧凑存储)
- 顺序访问内存(避免随机访问)
- 使用SOA(Structure of Arrays)代替AOS(Array of Structures)
- 减少缓存行污染

六、实际编程问题与解决方案

1. 实现线程安全的单例模式

cpp
class Singleton {
private:
static std::atomic instance;
static std::mutex mtx;

Singleton() = default;

public:
static Singleton getInstance() {
Singleton tmp = instance.load(std::memory_order_relaxed);
std::atomic_thread_fence

C++面试全攻略:从基础到高级的常见问题解析
微信扫一扫分享资讯
相关推荐
暂无相关推荐
微信公众号
手机浏览

Copyright C 20092014 All Rights Reserved 版权所有

地址: EMAIL:admin@admin.com

Powered by PHPYun.

关注

用微信扫一扫

反馈
顶部