CVTE C++开发 33mins 一面凉经

项目

1、消息的数据结构

2、数据是定长的还是不定长的

3、文件是如何传输的

4、定点通信要怎么做

C++

1、C++11特性有哪些

2、C++智能指针,底层实现

3、C++多态说一下

4、一个空类多少字节?加一个函数呢?加一个虚函数呢?

5、构造函数可以调用虚函数吗

6、析构函数可以是虚函数吗,不是虚函数会怎么样?

7、final关键字的作用

8、重载函数如何实现

Qt

1、讲一下元对象QObject

2、connect()包含哪些参数

3、有几种connect方式

计网

1、TCP如何保证可靠

2、TCP粘包问题和解决办法

2、ARP协议

3、讲一下keepalive

OS

1、进程通信的方式

2、共享内存实现原理

3、互斥锁底层实现

4、IO同步,IO异步

答案整理

C++

1、C++11特性有哪些
1)关键字:auto 关键字、nullptr代替NULL、for循环语法
2)array、forward_list、unordered_map、unordered_set
3) thread、atomic、condition_var
4)新智能指针unique_ptr、share_ptr、weak_ptr
5)function、bind、lambda

2、C++智能指针,底层实现

1) auto_ptr——自动回收内存资源
2)unique_ptr——限制一个指针指向一个内存
3)share_ptr——实现多个指针指向一个内存
4)weak_ptr——解决share_ptr循环引用的死锁问题

3、C++多态说一下
静态多态——函数模板和函数重载
动态多态——子类代码重写,基类指针指向不同子类相同函数实现不同的动作

4、一个空类多少字节?加一个函数呢?加一个虚函数呢?
空类占1字节,加一个函数还是1字节,加一个虚函数变为4字节

5、构造函数可以调用虚函数吗
可以

6、析构函数可以是虚函数吗,不是虚函数会怎么样?
析构函数可以是虚函数
类作为基类时析构函数必须为虚函数,否则会造成内存泄漏
类不被继承时析构函数不必设为虚函数,因为虚函数会消耗一定的内存资源

7、final关键字的作用
修饰类,表示该类不允许继承
修饰虚函数,表示该虚函数不允许重写

8、重载函数如何实现
重载函数表示,函数具有相同的函数名,参数不同
编译阶段,编译器根据参数的不同将相同函数名的函数编译成不同的函数名
运行阶段,就可以根据不同的函数名对重载函数进行调用

Qt

1、 讲一下元对象QObject
Qt中绝大多数的对象都是基于Qobject实现的
Meta Object Compiler元对象编译器,实现了元对象机制,增加了C++新特性
信号槽机制、复杂的定时器、层次化的对象树、智能指针等…

2、 connect()包含哪些参数
自定义对象/系统对象,信号函数,自定义对象/系统对象,槽函数,连接类型

3、 有几种connect类型
1)Qt::Autoconnection——自动解析连接类型
2)Qt::DirectConnection——发送者与接收者在同一个线程
3)Qt::QueuedConnection——发送者与接收者在同一个线程
4)Qt::BlockingQueuedConnection——发送者发送信号后进入阻塞状态,直到槽函数运行完
5)Qt::UniqueConnection——避免重复连接

计网

1、 TCP如何保证可靠
拥塞控制——保证网络不瘫痪——慢开始,拥塞避免,拥塞调整,快重传
流量控制——保证客户端与服务器的收发信息同步
确认机制——保证发出去的数据被完整地接收,通过序号化数据实现
超时重传——连续三次收到丢包,重传数据
验证和——对数据二进制求和取反,保证数据的完整性

2、 TCP粘包问题和解决办法
粘包原因
1)TCP协议基于流式传输,在缓存区会有多个TCP包
2)发送端等待缓存区满才发送数据
3)接收端等待缓存区满才读数据
4)TCP协议会将几个较小的包合并成一个进行发送
解决办法
1)发送定长包
2)包与包之间加边界符
3)给每个包指明长度
4)使用更复杂的应用层协议

3、 ARP协议
本地网络寻址:将主机B名转IP,在缓存找有没有对应的MAC,无则通过主机A的子网掩码判断是否属于同个子网,是则进行广播,主机B收到ARP广播对比自己的MAC,相同进行回应,主机A将主机B的MAC写入缓存,进行数据链路层的封装,发送数据。
非本地网络寻址:将主机B名转IP,在缓存找有没有对应的MAC,无则通过主机A的子网掩码判断是否属于同个子网,否则将数据包发送给自己的缺省网关,跳转到下一个路由器,路由器通过路由表决定将数据包从哪个接口发送。

4、 讲一下keepalive
TCP的keepalive意图保存客户端和服务器的连接,一方会不定期发送心跳包给另一方,当一方断开连接,没断开连接定时发送几次心跳包,如何连续收到断开方的RST,而不是ACK则断开连接。如果TCP没有keepalive机制,自动断开,没断开的会一直以为当前连接是存活的,这对服务器的连接资源影响会很大。
HTTP的keep-alive意图在短时间内连接复用,希望可以短时间内同一个连接上进行多次请求与响应。当客户端与服务器连接上后,传输完一次数据不会马上断开连接,而是让后面传输数据依旧走这一条TCP连接。

OS

1、 进程通信的方式
管道、信号量、信号、共享内存、消息队列、套接字

2、 共享内存实现原理
两个进程的地址空间为同一个物理空间,两个进程可以同时对内存进行读写访问。但由于共享内存本身未实现同步机制,需要自己配合信号量使用。
1)Ipcs -m 查看系统中的共享存储区
2)Ipcre -m[shmid] 删除系统中的共享存储段
3)int shmget(key_t key,size_t size,int shmflg) 创建共享内存
Key为IPC资源表示,size为申请共享内存的大小,shmflg创建模式
4)void *shmat(int shmid,const void *shmaddr,int shmflg) 挂接共享内存
Shmid为共享内存标识符,shmaddr为指定共享内存地址,shmflg读写挂接
5)Int shmdt(const void *shmaddr)去关联共享内存
Shmaddr为共享内存地址
6)Int Shmctl(int shmid,int cmd, struct shmid_ds *buf)销毁共享内存
Shmid为共享内存标识,cmd设为IPC_RMID可以删除共享内存,buf置NULL

3、互斥锁底层实现
通过一个标志位,进行原子分配,用时置0,释放置1

4、 linux的IO模式,同步异步的区别,阻塞与非阻塞的区别
阻塞IO:等待数据准备完毕,不干别的事就等待
非阻塞IO:等待数据准备完毕前 会返回进程干别的事
多路复用IO:内核通过select/epoll/poll 检测是否有准备好的数据 有则唤醒进程
信号驱动IO:进程通过sigaction注册信号函数,数据准备好内核发送信号
异步IO:进程通过aio_read,实现内核准备好数据并完成复制后再告诉进程

#CVTE##面经##广州视源电子科技股份有限公司##C++工程师#
全部评论
虚函数也可以被final修饰,表示往下的子类都不可以重写此虚函数
3 回复 分享
发布于 2021-09-07 09:25
写的很好!有个问题,基类构造函数可以调用虚函数的呀,调用只是它本身的虚函数,当做普通成员用
3 回复 分享
发布于 2021-09-13 18:58
楼主,你不是回答挺好的?怎么凉了
1 回复 分享
发布于 2021-09-13 22:36
点赞 回复 分享
发布于 2021-09-07 09:25
构造函数即使是派生类,也不会去定义成虚函数吧。
点赞 回复 分享
发布于 2021-09-07 11:44
lz啥时候笔试的啊,我到现在也没收到面试通知,都半个月了,状态显示选择面试时间,但是选不了
点赞 回复 分享
发布于 2021-09-14 20:25
感觉面试太八股了
点赞 回复 分享
发布于 2021-09-27 10:36

相关推荐

头像
10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
评论
21
124
分享
牛客网
牛客企业服务