C++面试题

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指的什么?

Microsoft Foundation Class

2、SendMessage和PostMessage区别?

1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。

2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。

3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.

如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。

3、MFC的对话框的种类,各自怎么使用?及相关函数

4、自定义一个Windows消息的发送与响应,有哪些步骤?

5、在MFC窗口中制作一个逃跑按钮(鼠标永远捕捉不到),该如何实现?

方法一:
创建一个类MyButton, 让该类从CButton类派生 
在该子类中处理鼠标移动事件, 鼠标移动到该按钮上, 计算随机位置, 移动按钮 
在窗口中拖放一个CButton按钮, 给该按钮关联一个MyButton类型的变量, 即可。

方法二:
设置鼠标WM_MOUSEMOVE的响应函数用于捕获鼠标移动操作,每当鼠标移动到btn上就修改属性隐藏,同时修改另一个btn的属性为显示,造成btn自动“逃跑”的假象。
具体可以参考:[MFC学习——“逃跑”按钮的实现](https://blog.csdn.net/sinat_20265495/article/details/51232045)

6、MFC中文档视图结构中都需要哪些类?

文档视图结构中有如下类:
(1)、文档类 
(2)、视图类 
(3)、框架类 
(4)、应用程序类 
在MFC框架的任何位置都可以访问窗口框架类: AfxGetMainWnd() 
在MFC框架的任何位置都可以访问应用程序类: AfxGetApp() 
视图类中访问关联的文档类: GetDocument() 
框架类中访问文档类: GetActiveDocument() 
框架类中访问视图类: GetActiveView()

7、音频信号压缩标准的编码主要有哪些?

aac MP3 ape flac

8、经采样、编码但未压缩的语音信号(对应G.711编码)是什么数据?

9、常见的数字音频编码文件格式有哪些,并简述其特点。

10、如何从H264码流中获取视频的分辨率大小?

11、H264码流中I帧,P帧,B帧的区别是什么?

 I帧是关键帧,帧内编码帧
 P帧是前向预测编码帧
 B帧是双向预测内插编码帧

12、回答下面的问题。

(1)、引用与指针的区别是什么?

指针和引用都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
程序为指针变量分配内存区域,而不为引用分配内存区域。

指针使用时要在前加 * ,引用可以直接使用。

引用在定义时就被初始化,之后无法改变;指针可以发生改变。 即引用的对象不能改变,指针的对象可以改变。

没有空引用,但有空指针。这使得使用引用的代码效率比使用指针的更高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

对引用使用“sizeof”得到的是变量的大小,对指针使用“sizeof”得到的是变量的地址的大小。

理论上指针的级数没有限制,但引用只有一级。即不存在引用的引用,但可以有指针的指针。
int **p //合法
int &&p //非法

++引用与++指针的效果不一样。
例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。

(2)、构造函数和析构函数是否可以被重载,为什么?

构造函数可以被重载,因为构造函数可以有多个且可以带参数。

析构函数不可以被重载,因为析构函数只能有一个,且不能带参数。

13、以下为 WindowsNT下的32位C++程序,请计算 sizeof的值
vold Func( char str[1001)
sIzeof( str)=?
d*kp= malloc( 100)
sizeof( p)=?

sIzeof( str)=4
sizeof( p)=4

14、编写 strcat函数
已知 strcat函数的原型是char* strcat(char* strDest,const char* strSrc)
其中 strDest是目的字符串, strss是源字符串。
不调用C++/C的字符串库函数,请编写函数 strcat

15、写一个函数找出一个整数数组中,第二大的数。
大概思路:先对整数数组按照升序进行排序,然后返回下标为1的第二大的数。


面试

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();//QVariant 转换为 Frame7E
方法2:使用qRegisterMetaType函数使得QT的信号槽支持自定义类型

参考:https://blog.csdn.net/xbnlkdbxl/article/details/56842565

#include

//注册自定义类型,使QT的信号槽支持我们的类型
qRegisterMetaType(“Frame7E”);//参数无所谓,建议带上同名字符串参数
注册完之后,就可以正常使用信号槽了。

需要注意以下几点:

1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include ,构造函数中加入代码:qRegisterMetaType(“Myclass”);
3、Myclass的引用类型需单独注册:qRegisterMetaType(“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熟悉吗?

4、进程和线程有什么区别?线程间的数据可以共享么?

5、TCP和UDP的有什么区别?

TCP服务端、客户端的实现流程一般是什么样的?

UDP需要建立连接么?

6、信号量一般怎么使用,熟悉么?

7、C语言或者C++中static关键字的作用?

1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。
3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。

8、protobuf协议有使用过么?

9、xml熟悉么?xpath是什么?

10、怎么让一个类只有一个唯一对象?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值