C++自用面试题
C/C++ 基础知识整理 C++自用面试题
1. C语言中 int 占几个字节
- 在C语言中,
int类型占用的字节数取决于编译器和系统架构 - 常见情况:
- 16位系统:通常为2字节
- 32位系统:通常为4字节
- 64位系统:通常为4字节
- 可使用
sizeof(int)查看具体大小
2. C中的数组与 std::array 的区别和联系
区别:
- 类型安全性:
std::array有边界检查,C数组没有 - 作为参数传递:C数组会退化为指针,
std::array保持完整信息 - 成员函数:
std::array有.size(),.begin(),.end()等方法 - 赋值操作:
std::array支持整体赋值,C数组不支持
联系:
- 都是连续内存存储
- 都是固定大小的容器
3. 数组的内存模型
- 数组在内存中是连续存储的
- 每个元素占用相同大小的空间
- 可以通过指针算术访问元素:
arr[i]等价于*(arr + i) - 多维数组也是按行优先或列优先顺序连续存储
4. Struct 结构体的内存占用如何计算
- 对齐原则:结构体成员按照最大对齐要求对齐
- 填充字节:编译器可能在成员间插入填充字节以满足对齐
- 计算步骤:
- 找出所有成员中最大的对齐要求
- 按顺序排列成员,必要时填充
- 最终大小是最接近的倍数
示例:
struct Example {
char a; // 1字节
// 3字节填充(假设int为4字节对齐)
int b; // 4字节
short c; // 2字节
// 2字节填充
}; // 总大小:1+3+4+2+2 = 12字节
5. 封装、继承、多态的概念
封装:
- 将数据和操作数据的方法绑定在一起
- 隐藏内部实现细节,只暴露必要接口
- 提高代码安全性和可维护性
继承:
- 子类继承父类的属性和方法
- 支持代码复用和扩展
- 包括:公有继承、保护继承、私有继承
多态:
- 同一接口,不同实现
- 静态多态:函数重载、运算符重载、模板
- 动态多态:虚函数机制
6. 常用STL容器与特性
常用STL容器:
- 序列容器:
vector,deque,list,array - 关联容器:
set,map,multiset,multimap - 无序关联容器:
unordered_set,unordered_map
vector扩容机制:
- 当容量不足时,按一定比例(通常1.5或2倍)重新分配内存
- 将原元素移动到新内存空间
- 释放旧内存
emplace_back 与 push_back 区别:
push_back:构造临时对象 → 拷贝/移动到容器emplace_back:直接在容器中构造对象,避免临时对象创建
set特性:
- 底层实现:通常为红黑树(平衡二叉搜索树)
- 元素有序:自动按升序排列
- 唯一性:不允许重复元素
- 时间复杂度:插入、删除、查找均为 O(log n)
7. 链表相关STL容器
- 双向链表:
std::list - 单向链表:
std::forward_list(C++11) - STL中没有专门的循环链表容器,但可用
list自行实现
8. 哈希函数与哈希表
哈希函数:
- 将任意大小数据映射到固定大小值(哈希值)
- 理想特性:快速计算、均匀分布、最小冲突
哈希表:
- 通过哈希函数将键映射到数组索引
- 解决冲突方法:链地址法、开放地址法
复杂度:
- 平均情况:插入、删除、查找 O(1)
- 最坏情况:所有操作 O(n)
- 空间复杂度:O(n)
C++11 新特性
9. 左值与右值、左值引用与右值引用
左值 vs 右值:
- 左值:有名称,可获取地址,持久存在
- 右值:临时对象,无名称,即将销毁
引用类型:
- 左值引用(
T&):绑定到左值 - 右值引用(
T&&):绑定到右值,支持移动语义
移动语义:允许资源转移而非拷贝,提高性能
10. 构造方法与析构方法
构造方法:
- 对象创建时自动调用
- 可重载,用于初始化对象状态
- C++11新增:委托构造函数
析构方法:
- 对象销毁时自动调用
- 用于清理资源,不能重载
委托构造:
- 一个构造函数调用同类的另一个构造函数
class MyClass {
int x, y;
public:
MyClass() : MyClass(0, 0) {} // 委托构造
MyClass(int a, int b) : x(a), y(b) {}
};
11. NULL与nullptr的区别
NULL:
- C语言中的空指针常量
- 通常定义为
0或(void*)0 - 在C++中可能导致类型推导问题
nullptr:
- C++11引入的类型安全的空指针
- 类型为
std::nullptr_t - 可隐式转换为任意指针类型
12. std::map 与 std::unordered_map
std::map:
- 基于红黑树实现
- 元素按键排序
- 操作复杂度:O(log n)
std::unordered_map:
- 基于哈希表实现
- 元素无序(但内部可能有桶顺序)
- 平均复杂度:O(1)
13. 智能指针
std::unique_ptr:
- 独占所有权
- 不可拷贝,只可移动
- 适用场景:单一所有者
std::shared_ptr:
- 共享所有权,引用计数
- 可拷贝
- 适用场景:多个所有者
std::make_shared vs new:
make_shared:单次内存分配(对象+控制块),异常安全new+shared_ptr:两次内存分配- C++14新增
std::make_unique
14. CMake与Makefile区别
Makefile:
- 直接指定构建规则和依赖关系
- 语法相对简单直接
CMake:
- 跨平台的构建系统生成器
- 生成对应平台的构建文件(Makefile, .sln等)
- 支持复杂项目配置
15. 常用CMake指令
# 引入子项目
add_subdirectory(subproject_dir)
# 生成可执行文件
add_executable(target_name source_files)
# 引入头文件目录
include_directories(dir)
# 连接库文件
target_link_libraries(target_name library_name)
# 查找库
find_package(PackageName REQUIRED)
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
泛型编程
16. 什么是泛型
- 编写与类型无关的代码
- 在C++中通过模板实现
- 提高代码复用性和类型安全性
17. 泛型编程要考虑的因素
- 类型约束:模板参数需支持的操作
- 编译时检查:错误在编译时发现
- 代码膨胀:每个不同类型实例化都会生成代码
- 编译时间:模板会增加编译时间
计算机组成原理
18. 什么是中断
- 处理器暂停当前任务,转去处理紧急事件
- 硬件中断:来自外部设备
- 软件中断:由程序指令触发
19. CPU如何处理中断
- 完成当前指令
- 保存当前上下文(PC、寄存器等)
- 跳转到中断服务程序(ISR)
- 执行ISR
- 恢复上下文,返回原程序
20. 冯诺依曼体系结构
五大组成部分:
- 运算器(ALU)
- 控制器(CU)
- 存储器(内存)
- 输入设备
- 输出设备
特点:存储程序、顺序执行
21. 什么是加法器
- 实现二进制加法的数字电路
- 基本类型:半加器、全加器
- 多位加法器:串行进位、并行进位
22. CPU多级缓存
缓存层次:
- L1 Cache:速度最快,容量最小
- L2 Cache:速度较快,容量较大
- L3 Cache:速度较慢,容量最大
Cache机制:
- 时间局部性:最近访问的数据可能再次访问
- 空间局部性:相邻数据可能被访问
- 替换策略:LRU、FIFO等
23. 各部件通信方式
- 系统总线:连接CPU、内存、I/O设备
- 类型:数据总线、地址总线、控制总线
24. 总线类型及作用
- 数据总线:传输数据
- 地址总线:指定内存地址
- 控制总线:传输控制信号
25. 流水线技术
- 将指令执行分成多个阶段
- 多指令并行执行
- 提高CPU吞吐率
- 面临问题:数据冲突、控制冲突
多线程
26. 进程和线程的区别
进程:
- 资源分配的基本单位
- 拥有独立的地址空间
- 进程间通信需要特殊机制
线程:
- CPU调度的基本单位
- 共享进程资源
- 通信更方便
27. 什么是僵尸进程
- 子进程结束,但父进程未调用wait()
- 占用系统进程表项
- 已释放大部分资源,仅保留退出状态
28. 进程间数据同步方法
- 共享内存:最高效,需同步机制
- 消息队列:内核维护的消息链表
- 信号量:控制对共享资源的访问
- 管道:单向通信,有匿名和命名两种
- Socket:网络或本地通信
29. 线程间数据同步
同步机制:
- 互斥锁(mutex):保护临界区
- 条件变量:线程等待特定条件
- 信号量:控制资源访问数量
- 读写锁:区分读写操作
30. RTOS与Linux区别
RTOS(实时操作系统):
- 硬实时:严格保证任务时限
- 轻量级,可预测性高
- 例:FreeRTOS, VxWorks, QNX
Linux:
- 通用操作系统
- 软实时:尽力保证时限
- 功能丰富,生态完善
Linux常用操作
31. 下载文件命令
# wget
wget http://example.com/file.tar.gz
# curl
curl -O http://example.com/file.tar.gz
# scp(远程复制)
scp user@host:/path/file .
32. 查找文件命令
# find命令
find /path -name "filename"
find . -type f -name "*.cpp"
find /home -size +100M
# locate命令(需先updatedb)
locate filename
# which命令(查找可执行文件)
which gcc
网络
33. TCP/IP vs OSI模型
TCP/IP四层模型:
- 应用层(HTTP, FTP, SMTP)
- 传输层(TCP, UDP)
- 网络层(IP, ICMP)
- 网络接口层
OSI七层模型:
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
34. TCP vs UDP
TCP:
- 面向连接
- 可靠传输(确认、重传)
- 流量控制、拥塞控制
- 保证顺序
UDP:
- 无连接
- 不可靠传输
- 无控制机制
- 速度快,开销小
35. TCP流量控制
- 滑动窗口协议:接收方通告可用缓冲区大小
- 动态调整发送速率
- 防止接收方缓冲区溢出
36. 子网掩码与IP地址
IP地址:
- 标识网络中的设备
- IPv4:32位,点分十进制
- IPv6:128位,冒号分隔
子网掩码:
- 划分网络号和主机号
- 与IP地址按位与得到网络地址
- 例:255.255.255.0(/24)
37. 什么是DHCP
- 动态主机配置协议
- 自动分配IP地址、子网掩码、网关等
- 工作流程:发现、提供、请求、确认
数据库
38. MySQL WHERE子句
-- 基本用法
SELECT * FROM users WHERE age > 18;
-- 多条件
SELECT * FROM users WHERE age > 18 AND status = 'active';
-- 模式匹配
SELECT * FROM users WHERE name LIKE '张%';
-- IN操作符
SELECT * FROM users WHERE id IN (1, 3, 5);
39. 存储过程与优化
存储过程:
- 预编译的SQL语句集合
- 减少网络传输
- 提高安全性
优化策略:
- 合理使用索引
- 避免不必要的循环
- 使用参数化查询
- 定期维护统计信息
Qt框架
40. Qt中的MVC架构
MVC模式:
- Model:数据模型,业务逻辑
- View:用户界面,数据展示
- Controller:处理用户输入
Qt实现:
QAbstractItemModel:模型基类QListView/QTableView:视图组件- 委托(Delegate):控制器角色
41. Connect函数用法
// Qt4风格(信号槽字符串)
connect(sender, SIGNAL(valueChanged(int)), receiver, SLOT(updateValue(int)));
// Qt5风格(类型安全)
connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
// 参数说明
connect(sender, // 发送对象
signal, // 信号
receiver, // 接收对象
slot, // 槽函数
type); // 连接类型(Qt::AutoConnection等)
42. QProcess
- 启动外部进程并通信
- 功能:启动、终止、状态监控、标准I/O重定向
QProcess process;
process.start("ls", QStringList() << "-l");
process.waitForFinished();
QString output = process.readAllStandardOutput();
43. QtConcurrent
- 高级并发编程API
- 基于线程池
- 提供map、filter、reduce等并行操作
// 并行运行函数
QFuture<void> future = QtConcurrent::run(myFunction);
// 并行处理容器
QList<int> results = QtConcurrent::blockingMapped(list, &processItem);
44. QSS与CSS关系
QSS:
- Qt样式表,类似CSS语法
- 用于Qt控件样式定制
- 支持选择器、属性、伪状态
加载方法:
// 1. 从文件加载
QFile file("style.qss");
file.open(QFile::ReadOnly);
qApp->setStyleSheet(file.readAll());
// 2. 字符串设置
widget->setStyleSheet("QPushButton { color: red; }");
// 3. QRC资源文件
QFile file(":/styles/style.qss");
与CSS区别:
- QSS专为Qt控件设计
- 支持Qt特定属性
- 不支持所有CSS3特性
- 选择器语法略有不同

浙公网安备 33010602011771号