浙江中控 C++ 面经:常量指针、位域、UDP 传图与 Qt 视频流
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 讲一下常量指针与指针常量。
- 说一下项目里用到的数据结构。
- 知道结构体的位域吗?
- 讲一下结构体里字符长度怎么计算,int 溢出后会怎么样?
- 项目里服务器端用到的 TCP + 多线程讲一下。
- C++11 里知道哪些新特性,具体讲一下。
- 对 C++ 的继承、多态、封装了解吗?简单说一下。
- 项目里用到的信号与槽机制说一下。
- 项目里的旋转功能是怎么实现的?有用到三维坐标系吗?
- Qt 端实现视频流数据用到了 Qt 的哪些组件,如何实现?简单说一下。
- 如何保证 UDP 传输图片的前后关系?
- 项目里有涉及到线程安全吗?简单说一下。
- 线程怎么退出?图片间隔传输调用哪个函数?
- 手搓冒泡排序。
- 一个大型项目里有很多文件,一旦出现重复定义错误,你会怎么解决?
- 介绍下用到的这块开发板。
- 你用过 Git 或者 SVN 这两个代码管理工具吗?
《参考解析》
常量指针与指针常量:const int *p 是指向常量的指针,指针本身可变、指向的内容不可改;int *const p 是指针常量,指针本身不可变、内容可改;const int *const p 两者都不可改。判断方法是看 const 在 * 的左边还是右边。
位域与结构体长度:位域让多个字段共用一个存储单元(如 unsigned a:3),长度计算要按编译器的对齐规则和底层类型宽度算,跨平台差异大,工程里通常不拿位域做跨模块协议结构。字符长度计算看的是「有效字符数还是字节数」——UTF-8 下中文占 3 字节,strlen 数到 \0 为止,sizeof 在编译期就定好;int 溢出是有符号未定义行为,无符号则按模回绕。
用 UDP 传图怎么保证顺序:UDP 本身不保证顺序和到达,要在应用层加序号与分片信息,接收端按序号重组、丢弃过期帧、缺片就用上一帧或请求重传;实时视频更常见的做法是「宁可丢帧也不等」,用时间戳判断新旧,只有关键帧才要求完整。
Qt 视频流的常用组件:QMediaPlayer + QVideoWidget 适合通用播放,QAbstractVideoSurface 或 QVideoSink 可以拿到底层帧做自定义渲染,配合 QImage/QPainter 或 OpenGL 纹理上传;解码与渲染放在不同线程,用信号槽跨线程投递(注意连接类型选队列连接)。
线程退出与间隔传图:用原子标志位或 QThread::requestInterruption 配合 isInterruptionRequested,避免 terminate();间隔传输一般用 QTimer 定时触发,或在采集线程里 sleep 到下一帧时间戳。
重复定义/链接错误的排查:先看完整报错定位到符号,再判断是头文件里定义了变量或函数体(应改成声明 + extern)、inline 未加、模板实例化重复,还是一个 .cpp 被重复加入构建;用 nm 看目标文件里的符号类型(T/D/B 表示已定义)能快速缩小范围。
冒泡排序:外层循环 n-1 趟,内层比较相邻元素交换,每趟把最大值冒到末尾,可以加 swapped 标记提前结束;时间 O(n²)、最好 O(n)、空间 O(1)、稳定。