C++音视频开发 面试1
技能要求:Socket,MFC,Windows
岗位职责:
1、参与需求分析、模块开发等相关工作;
2、在windows平台下进行C/C++应用程序设计、开发、测试;
3、参与软件系统或模块的联调,协助测试人员进行软件测试,修复BUG;
4、参与编写相关技术文档。
任职要求:
(1)统招本科及以上毕业,计算机相关专业毕业,3年以上C++研发工作经验;
(2)熟悉Windows操作系统,精通C/C++、面向对象软件设计,熟悉多线程控制及MFC界面编程等;
(3)有大型C/C++服务器研发经验优先,熟悉TCP/IP协议;
(4)具备通信基础知识、有音视频系统相关开发经验优先;
(5)具有良好的编程习惯,积极沟通反馈,善于团队协作。
C++ 笔试题
1、MFC指的什么?
2、SendMessage和PostMessage区别?
3、MFC的对话框的种类,各自怎么使用?及相关函数
4、自定义一个Windows消息的发送与响应,有哪些步骤?
5、在MFC窗口中制作一个逃跑按钮(鼠标永远捕捉不到),该如何实现?
6、MFC中文档视图结构中都需要哪些类?
7、音频信号压缩标准的编码主要有哪些?
aac MP3 ape flac
8、经采样、编码但未压缩的语音信号(对应G.711编码)是什么数据?
9、常见的数字音频编码文件格式有哪些,并简述其特点。
10、如何从H264码流中获取视频的分辨率大小?
11、H264码流中I帧,P帧,B帧的区别是什么?
12、回答下面的问题。
(1)、引用与指针的区别是什么?
(2)、构造函数和析构函数是否可以被重载,为什么?
13、以下为 WindowsNT下的32位C++程序,请计算 sizeof的值
vold Func( char str[1001)
SIzeof( str)=?
dkp= malloc( 100)
sizeof( p)=?
14、编写 strcat函数
已知 strcat函数的原型是char* strcat(char* strDest,const char* strSrc)
其中 strDest是目的字符串, strss是源字符串。
不调用C++/C的字符串库函数,请编写函数 strcat
15、写一个函数找出一个整数数组中,第二大的数。
面试
1、对MFC熟悉么?写过复杂的界面没有?还有文档视图使用的多不?
2、使用过哪些VC++中的线程同步?
3、VC++中网络模型熟悉不?比如说完成端口、重叠IO
C++ 技术面试2
1、模板的主要用途和实现机理是什么?
2、STL vector是怎么实现的,内部原理是什么?
3、你觉得你是一个什么样的人?
(1)、对技术钻研比较深入,不太在于工资,对技术很狂热。
(2)、做工资就是看工资,不在乎使用什么技术,只要赚钱就行。
4、你的未来职业规划是什么?
5、Modbus协议的原理和内部机制、分类等
6、TCP和UDP的区别?
7、Boost库熟悉哪些?
8、C++11熟悉么?
auto、lambda表达式,
右值引用熟悉么?完美转发熟悉么?
9、STL标准库熟悉么?熟悉哪些容器和算法?
10、多线程熟悉么?多线程一般需要注意哪些问题?你使用到哪些锁?mutex、读写锁,unique_lock用过没?
11、进程间通信使用过哪一些?
信号量、共享内存、油槽
12、对QT、MFC熟悉么?
C++面试3
1、WebSocket和Socket有什么区别?
2、对高并发熟悉么?你们做的TCP Server并发量高么?
3、你最近的一份工作中遇到的一个难点和问题是什么?你是怎么解决的?
4、你在你们项目中负责什么?担任什么角色?
5、Boost库中为什么大量使用hpp文件?基于什么考虑?
Boost库的头文件与我们平常所用的头文件(*.h)或者C++标准库头文件(没有后缀名)不同,它是把C++类的声明和实现放在了一个叫做.hpp文件中。之所以这么做,一是与普通C头文件区分开,还有一个重要的原因是使Boost库不需要预先编译,可以直接引入程序员的工程即可编译链接,方便库的使用。最后有一个原因就是C++编译器的限制,许多编译器还不支持C++标准提出的模板分离编译模式(export关键字),而Boost库大量使用了模板,为了保持与各个编译器的兼容,也不得不采用这种.hpp的头文件形式。
6、模板的实现可以写在.h文件中吗?
7、C++模板类代码只能写在头文件?
这个问题,实际上我几年前就遇到了。最近写个模板类玩的时候,再次遇到。
当我非常仔细的将定义和实现分开,在头文件中保留了最少的依赖后,一切就绪.cpp单独编过。但是当使用的时候,就会报告所有的函数调用都没有实现。按常规.h/.cpp而言这是不可能的。但是模板类就是这么独特。简单说说他的原因,也备自己将来遗忘:
从语法角度而言,是没有强制要求说模板代码的声明和实现不可以分开。那么当分离的声明和实现写好后,单独编译.cpp是可以通过的,但是生成的.o文件却非常小,只有一个原因:确实没有任何实现代码!————不知道用什么类型参数套用模板。
因为模板类需要在使用到的地方利用声明模板的typename或者class参数的时候,才会即时生成代码。那么当我把模板声明和实现分开的时候,这个即时过程因为编译器只能通过代码include“看到”头文件而找不到模板实现代码,所以会产生链接问题。这也是为什么几乎都会建议模板类和声明和实现都写在头文件。
如果刚接触c/c++编写的朋友可能还不是很明白。编译器面对巨量代码的时候,也是以一个一个的.cpp/.c文件作为基本单元,根据代码的include包含找到声明,翻译代码产生.o文件。注意他们每个cpp/c文件都是相互独立完成自己工作的,对于缺少的部分,如果妥善声明,会留待链接过程的时候产生引用关系。 那么刚才说的模板类实现代码,编译它的时候因为不知道套用什么参数,实际上没有任何有用的内容存在于.o文件当中。而在使用模板类的地方指定了类型参数,编译器这才开始根据模板代码产生有用的.o编码,可是这些内容放在了使用模板的代码产生的.o文件当中。如果编使用模板代码的时候,通过include包含“看不到”模板的实现代码,这些所有的缺失,到链接阶段就无法完成。
所以最后的结论是:请老老实实把模板的实现和声明都写在头文件吧。如果你很有想法有个性,可以坚持,然后试试#include “xxxx.cpp” 这样屌炸的代码。
Qt C++面试4
1、谈谈Qt的信号-槽的实现机理
信号-槽是一种对象之间的通信机制,是Qt在标准C++之外,使用元对象编译器(MOC)实现的语法糖
2、对23种常见的设计模式熟悉哪些?
观察者模式、单例模式、工厂模式、状态模式
3、Boost库中的Singal2信号-槽和Qt中的信号-槽有什么区别?
4、Qt中多线程中槽函数是怎么调用的,调用的时机是什么?
Qt中 QThread 实现线程有几种方式?
5、在信号-槽中是怎么传递自定义结构体的?
QT信号槽收发自定义类/自定义结构体的2种方法
想要发射信号时,携带自定义的class或者struct,必须要做一下处理,否则编译时不会报错,但运行时会出错。
假设我们自定义了一个结构体:
typedef struct
{
...//
...//
}Frame7E;
如果想要这么用:
Frame7E frame;
...//填充frame
emit sendFrame(frame);
那么必须使用以下两种方法之一。
方法1:使用宏:Q_DECLARE_METATYPE
该方法的原理是使得QVariant类支持我们自定义的类型,而QT的信号槽是支持发射QVariant类型数据的,然后我们可以用QVariant封装这个自定义类/结构,然后emit 出去QVariant类型的变量。
include <qmetatype.h>
//发射端
Frame7E frame;
...//填充frame
QVariant var;
var.setValue(frame); // copy s into the variant
emit sendFrame(var);//发QVariant类型的信号
接收端
// retrieve the value
Frame7E s2 = var.value<Frame7E>();//QVariant 转换为 Frame7E
方法2:使用qRegisterMetaType函数使得QT的信号槽支持自定义类型
参考:https://blog.csdn.net/xbnlkdbxl/article/details/56842565
include <QMetaType>
//注册自定义类型,使QT的信号槽支持我们的类型
qRegisterMetaType<Frame7E>("Frame7E");//参数无所谓,建议带上同名字符串参数
注册完之后,就可以正常使用信号槽了。
需要注意以下几点:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");
8、Windows进程间通信的方式有哪些?
9、WebSocket和Socket有什么区别?
10、谈谈Qt的DBus
C++面试5
1、STL vector做大量push_back操作时会出现什么问题?
2、boost库 指针的原理,怎么做到动态分配内存不delete?
3、模板你在项目中使用的多吗?
C++面试6
1、派生类怎么调用基类的虚函数版本?
C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
也就是说:
当你实现派生类B的虚函数B::foo()时,如果函数体内需要调用基类的虚函数版本时,需要显示使用基类A的作用域操作符A::foo(),否则foo()就会在派生类作用域调用派生类版本的虚函数,这样会导致无穷递归。
就是自己在调用自己,没有指明调用的是基类的虚函数,自动认为是调用派生类的虚函数,然后就再次调用了,一直进行下去了。
struct A
{
virtual void foo(void) { }
}
struct B: public A
{
void foo(void)
{
foo(); // 递归调用自己,即 B::foo()
A::foo(); // 明确告诉编译器,调用的是 A::foo(), 而不是自己
}
}
2、STL map:erase删除元素之后迭代器失效的问题
当删除map迭代器中的某个元素时,会出现迭代器失效,该如何安全的解决处理?
3、智能指针了解么?
shared_ptr、unique_ptr、weak_ptr、scope_ptr有什么区别
4、面向对象:虚函数和纯虚函数有什么区别?
5、如何保证访问STL容器比如vector、map、set线程安全?读写前后加锁处理
6、单例模式
指针: 会出现多线程访问的new多个对象的问题
static 成员变量:所有类都使用同一个对象
7、你目前这份工作解决的最大难题是什么,谈谈你是怎么解决的?
C++面试7
1、二级指针 指针的指针一般用来做什么?
2、动态数组使用C语言怎么实现?
3、对Linux熟悉吗,比如常见的命令、发行版?chmod命令是用来干什么的?
4、进程和线程有什么区别?线程间的数据可以共享么?
5、TCP和UDP的有什么区别?
TCP服务端、客户端的实现流程一般是什么样的?
UDP需要建立连接么?
6、信号量一般怎么使用,熟悉么?
7、C语言或者C++中static关键字的作用?
1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。
3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。
8、protobuf协议有使用过么?
9、xml熟悉么?xpath是什么?
10、怎么让一个类只有一个唯一对象?