C++自用面试题

C/C++ 基础知识整理 C++自用面试题

1. C语言中 int 占几个字节

  • 在C语言中,int 类型占用的字节数取决于编译器和系统架构
  • 常见情况:
    • 16位系统:通常为2字节
    • 32位系统:通常为4字节
    • 64位系统:通常为4字节
  • 可使用 sizeof(int) 查看具体大小

2. C中的数组与 std::array 的区别和联系

区别:

  1. 类型安全性:std::array 有边界检查,C数组没有
  2. 作为参数传递:C数组会退化为指针,std::array 保持完整信息
  3. 成员函数:std::array 有 .size(), .begin(), .end() 等方法
  4. 赋值操作:std::array 支持整体赋值,C数组不支持

联系:

  • 都是连续内存存储
  • 都是固定大小的容器

3. 数组的内存模型

  • 数组在内存中是连续存储的
  • 每个元素占用相同大小的空间
  • 可以通过指针算术访问元素:arr[i] 等价于 *(arr + i)
  • 多维数组也是按行优先或列优先顺序连续存储

4. Struct 结构体的内存占用如何计算

  • 对齐原则:结构体成员按照最大对齐要求对齐
  • 填充字节:编译器可能在成员间插入填充字节以满足对齐
  • 计算步骤:
    1. 找出所有成员中最大的对齐要求
    2. 按顺序排列成员,必要时填充
    3. 最终大小是最接近的倍数

示例:

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. 泛型编程要考虑的因素

  1. 类型约束:模板参数需支持的操作
  2. 编译时检查:错误在编译时发现
  3. 代码膨胀:每个不同类型实例化都会生成代码
  4. 编译时间:模板会增加编译时间

计算机组成原理

18. 什么是中断

  • 处理器暂停当前任务,转去处理紧急事件
  • 硬件中断:来自外部设备
  • 软件中断:由程序指令触发

19. CPU如何处理中断

  1. 完成当前指令
  2. 保存当前上下文(PC、寄存器等)
  3. 跳转到中断服务程序(ISR)
  4. 执行ISR
  5. 恢复上下文,返回原程序

20. 冯诺依曼体系结构

五大组成部分:

  1. 运算器(ALU)
  2. 控制器(CU)
  3. 存储器(内存)
  4. 输入设备
  5. 输出设备

特点:存储程序、顺序执行

21. 什么是加法器

  • 实现二进制加法的数字电路
  • 基本类型:半加器、全加器
  • 多位加法器:串行进位、并行进位

22. CPU多级缓存

缓存层次:

  • L1 Cache:速度最快,容量最小
  • L2 Cache:速度较快,容量较大
  • L3 Cache:速度较慢,容量最大

Cache机制:

  • 时间局部性:最近访问的数据可能再次访问
  • 空间局部性:相邻数据可能被访问
  • 替换策略:LRU、FIFO等

23. 各部件通信方式

  • 系统总线:连接CPU、内存、I/O设备
  • 类型:数据总线、地址总线、控制总线

24. 总线类型及作用

  1. 数据总线:传输数据
  2. 地址总线:指定内存地址
  3. 控制总线:传输控制信号

25. 流水线技术

  • 将指令执行分成多个阶段
  • 多指令并行执行
  • 提高CPU吞吐率
  • 面临问题:数据冲突、控制冲突

多线程

26. 进程和线程的区别

进程:

  • 资源分配的基本单位
  • 拥有独立的地址空间
  • 进程间通信需要特殊机制

线程:

  • CPU调度的基本单位
  • 共享进程资源
  • 通信更方便

27. 什么是僵尸进程

  • 子进程结束,但父进程未调用wait()
  • 占用系统进程表项
  • 已释放大部分资源,仅保留退出状态

28. 进程间数据同步方法

  1. 共享内存:最高效,需同步机制
  2. 消息队列:内核维护的消息链表
  3. 信号量:控制对共享资源的访问
  4. 管道:单向通信,有匿名和命名两种
  5. Socket:网络或本地通信

29. 线程间数据同步

同步机制:

  1. 互斥锁(mutex):保护临界区
  2. 条件变量:线程等待特定条件
  3. 信号量:控制资源访问数量
  4. 读写锁:区分读写操作

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四层模型:

  1. 应用层(HTTP, FTP, SMTP)
  2. 传输层(TCP, UDP)
  3. 网络层(IP, ICMP)
  4. 网络接口层

OSI七层模型:

  1. 物理层
  2. 数据链路层
  3. 网络层
  4. 传输层
  5. 会话层
  6. 表示层
  7. 应用层

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语句集合
  • 减少网络传输
  • 提高安全性

优化策略:

  1. 合理使用索引
  2. 避免不必要的循环
  3. 使用参数化查询
  4. 定期维护统计信息

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特性
  • 选择器语法略有不同
posted @ 2025-12-04 08:43  BlackSnow  阅读(90)  评论(0)    收藏  举报