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  阅读(29)  评论(0)    收藏  举报