通常Qt开发岗位面试笔试题,有两部分c/c++和Qt
一、c/c++
一、看博客从第一遍到第七篇https://blog.csdn.net/weixin_53000184/article/details/124760602
二、static作用
1、静态变量声明
局部静态变量:在静态存储区,局部有效,直到程序结束系统回收,只被初始化一次,
全局静态变量:在静态存储区,本文件有效,直到程序结束系统回收,未赋值默认为0
2、类静态成员变量
所有对象都共享说同一份数据,类内声明,类外初始化操作,在编译阶段分配内存
3、类静态成员函数
所有对象共享同一个函数,静态成员函数只能访问静态成员变量
二、const作用
定义变量:用来声明一个常量,保护被修饰的东西,防止意外的修改
定义函数(只在Qt):不能对数据成员参数进行修改
定义对象(只在Qt),不能引用非const的成员函数
三、数据存储位置
静态区:static、全局变量
栈区:局部变量
堆区:new申请的内存(c++) malloc(c)
四、c和c++ 中的struct有什么不同?
c和c++ 中struct的主要区别是c中的struct不可以含有成员函数,而c++ 中的struct可以。
c++ 中struct和class的主要区别在于默认的存取权限不同,struct默认为public ,而class默认为
private
五、c和c++区别
c是面向过程,c++面向对象
c++可以进行多态、封装和继承
六、头文件中的ifndef/define/endif 干什么用?
防止该头文件被重复引用。
七、虚函数、纯虚函数、重载
virtual来表示虚函数
虚函数 代表的是子类可以重写父类的虚函数
纯虚函数 virtual {} =0 ,子类必须重写父类的纯虚函数
重载 指函数的参数不同
八、实现c++ replace替换函数,实现C的strstr查找函数、strcmp比较函数、strcpy拷贝函数、strcat拼接函数
九、实现4大排序冒泡排序、选择排序、直接插入排序、归并排序(有道C/C++文件夹下有描述)
二、Qt部分
一、信号和槽
1、信号和槽的本质
回调函数,两个类之间进行通信;信号传递值发生动作,槽函数响应信号接收;根据动作变化来做出对应操作。
2、信号槽机制与优势与不足
(1)优点:
类型安全,关联的信号槽,信号与槽参数类型个数必须是等同的,否则编译器会报错
松散耦合:减弱了Qt对象的耦合度,发射信号不需要知道哪个槽接收
灵活性:一个信号可以关联多个槽,或多个信号关联同一个槽。
(2)缺点
比回调函数速度慢很多,因为需要定位接收信号的对象,遍历所有关联
3、信号槽的多种用法
(1)一个信号可以和多个槽相连
如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。
(2)多个信号可以连接到一个槽
只要任意一个信号发出,这个槽就会被调用。
(3)一个信号可以连接到另外的一个信号
当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。
(4)槽可以被取消链接
这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。
二、connect的第五个参数(总共五种连接)
多线程下,信号槽分别在什么线程中执行
可以通过connect的第五个参数进行控制信号槽执行时所在的线程
connect有几种连接方式,直接连接和队列连接、自动连接
1、直接连接(Qt::DirectConnection):信号槽在信号发出者所在的线程中执行
2、队列连接 (Qt::QueuedConnection):信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行
3、自动连接 (Qt::AutoConnection):多线程时为队列连接函数,单线程时为直接连接函数。
另外两种
阻塞队列连接(发送完信号,发送线程会阻塞),唯一连接(防止重复连接)
三、connect的三种写法
1、老版本标准
connect(btnClick,SIGNAL(Clicked(bool)),this,SLOT(onClicked(bool)));
优点,写法明确,一眼就能看出参数
缺点,麻烦
2、QT5.0后推出
connect(btnClick,&MyButton::sigClicked,this,&Widget::onClicked);
优点,简单
缺点,信号函数是重载的,无法识别
3、Lambda 函数写法
connect(m_pBtn, static_cast<void>(&MyButton::sigClicked), this, [=](bool check)});;
四、多线程使用使用方法
(1)方法一:
创建一个类从QThread类派生
在子线程类中重写 run 函数, 将处理操作写入该函数中
在主线程中创建子线程对象, 启动子线程, 调用start()函数
优点:可以通过信号槽与外界进行通信
缺点:每次新建一个线程都需要继承QThread,实现一个新类
适用场景:QThread适用于那些常驻内存的任务
(2)方法二:
(1)实例化一个QThread,之后将继承自QObject的对象
通过QOjbect::moveToThread()搬到之前实例化的QThread执行
(2)将业务处理抽象成一个业务类, 在该类中创建一个业务处理函数
在主线程中创建一QThread类对象,在主线程中创建一个业务类对象
将业务类对象移动到子线程中
在主线程中启动子线程,通过信号槽的方式, 执行业务类中的业务处理函数
注意:
子线程中不能处理ui窗口
业务对象, 构造的时候不能指定父对象
(3)方法三:
QFuture< void> fut1 = QtConcurrent::run(processFun, command);
processFun为线程回调函数
五、Qt中的常用容器类
QVector(wei ke te):基于数组实现的动态数组容器类,支持快速的随机访问和尾部插入操作。适合于需要频繁随机访问的情况。
QList:基于双向链表实现的容器类,支持高效的插入和删除操作。适合于需要频繁插入和删除元素的情况。
QLinkedList:基于双向链表实现的容器类,支持高效的插入和删除操作,但不支持随机访问。适合于需要频繁插入和删除元素,但不需要随机访问的情况。
QSet:基于哈希表实现的集合容器类,支持高效的查找和插入操作,不允许重复元素。适合于需要快速查找元素,且不需要重复元素的情况。
QMap:基于红黑树实现的映射容器类,支持高效的查找和插入操作,键值对按照键的大小有序排列。适合于需要按键进行排序和快速查找的情况。
QHash:基于哈希表实现的映射容器类,支持高效的查找和插入操作,键值对无序存储。适考合于需要快速查找键值对,且不需要按键排序的情况。
QStringList:基于QString实现的字符串列表容器类,支持高效的字符串操作,如拼接、查找、替换等。适合于处理字符串列表的情况。
QByteArray(bai te e rui):基于char数组实现的字节数组容器类,支持高效的二进制数据读写操作。适合于处理二进制数据的情况。
减少内存使用:使用智能指针、减少不必要的拷贝,避免频繁的new和delete操作,QVector代替QList
减少绘制次数:使用QPainter的缓存绘制功能,对于需要频繁绘制的控件,将绘制结果缓存起来,只在需要更新时才进行重绘。
使用多线程:在需要大量计算的场景中,将计算放到后台线程中,避免阻塞UI
避免频繁的信号和槽连接:频繁的信号和槽连接会带来额外的开销,将一些信号槽的连接放到初始化,避免重复连接。
合理使用QML:对于需要频繁更新的UI组件,使用QML实现,能够减少UI线程的工作量,提高UI性能。
七、为什么要用qt来做界面
Qt的跨平台性很强,比如同样一套代码写好pro文件,可在windows/linux/Android系统等直接编译。
七、qt 回收资源方法
1、在new时候指定父亲,那么它的清理时在父亲被delete的时候delete的
2、setCentralWidget() 用这个函数设置
3、手动delete
4、deleteLater()
5、智能指针:智能指针封装为QPointer类
八、数据库QSQLITE
1、插入 insert into stu (id ,name, age) values(1,'mike',18);
2、更新 update stu set name='mi' where id = 3;
3、查找所有 select *from stu。指定查找:select age from stu where name = 'mike';
4、删除表 drop table stu 删除某一项delete from stu where name = 'tom';
主要两个类:QSqlDatabase、QSqlQuery(kui e rui)
SELECT - 从数据库中提取数据 (se le ke)
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据 (in se te)
CREATE DATABASE - 创建新数据库 (kui A te)
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表 (jo p)
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
三、补充
一、TCP
1、三次握手流程
1)服务端进入监听状态状态
第一次握手:客户端请求建立链接
第二次握手:针对客户端的SYN确认应答,并请求建立链接
第三次握手:客户端确认应答
2、TCP和UDP区别
基于连接与无连接
对系统资源的要求(TCP较多,UDP少);
TCP点对点连接,UDP可以一对多、多对多
UDP程序结构较简单;
流模式与数据报模式 ;
TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
二、UDP
区分UDP和TCP
三、HTTP
1、工作原理:客户端通过URL向HTTP服务端发送所有请求。
2、常用请求类型:get和post
3、get和post区别
区别一:get重点在从服务器上获取资源,post重点在向服务器发送数据;
区别二:get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等; post较get安全性较高;
区别三:get传输数据是通过URL请求,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的
区别四:get传输的数据量小,因为受URL长度限制,但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式;
区别五:get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。post支持标准字符集,可以正确传递中文字符。
四、内存泄漏方式 四类
(1)常发性:每次执行都会导致泄露
(2)偶发性:特定环境
(3)一次性:只会执行一次
(4)隐式内:无限制分配内存
五、设计模式
1、单例模式 static声明静态函数,返回实例化对象,如果没被实例化,先实例化对象
2、工厂模式
六、互斥锁
对共享数据进行锁定,保证同一时刻只能有一个线程去操作。