C++社招面经【C++/QT】
杭州近江科技有限公司
1、QT的信号槽
Qt的信号与槽机制使用了观察者模式。
发出信号的对象就是该模式中的主对象,
而提供槽函数的对象就是该模式中的观察者。
connect函数连接一个信号与一个槽,
实际上添加了一个新观察者。
而disconnect函数实际上删除一个观察者。
当信号产生时,所有观察者的槽函数会被调用,
观察者可以更新自己的状态。
2、QT的事件,什么时候用继承,什么时候用注册
【1】继承event虚函数,处理传递过来的所有事件
【2】继承细化QEvent函数,例如QMousePressEvent()函数,处理特定事件
【3】如果一个控件A需要对另一个控件B状态变化做出相应的处理,即观察另一个控件;A观察B
如果二者存在父子关系,可以通过event函数返回false,将该变化传递给父控件处理;
如何二者不存在父子关系;则需要通过QT的EventFilter来解决这个问题;B->installEventFilter(A);B要把A归到自己的观察者队列里;A要重写自己的eventFilter函数来接收处理B的状态变化
【事件过滤是另一个常见的应用场景。通过重写QObject的eventFilter函数,我们可以在事件到达目标对象之前对其进行拦截和处理。
QObject可以通过event()接收事件并且过滤其它对象的事件。详细情况请参考installEventFilter()和eventFilter()。】
事件记录和监控:您可以使用eventFilter来监控和记录应用程序中发生的各种事件,如鼠标点击、按键操作等。
自定义事件处理:通过捕获目标对象的特定事件,您可以为其添加自定义的行为,而无需修改原始对象的代码。
事件过滤和拦截:您可以根据需要拦截特定的事件,以便在事件传递到原始对象之前进行自定义处理。
动态UI调整:通过拦截事件,您可以根据运行时条件调整UI元素的显示和行为,从而实现动态UI效果
3、多进程读写数据库,出现内存中数据和数据库数据不一致的问题时该如何解决
【1、使用消息队列,先更新数据库,再逐步更新缓存;2、设置过期时间,再过期之后定时更新缓存;3、删除缓存的数据,更新数据库,缓存中没有此数据时从数据库更新到缓存;4、更新数据库和缓存同时进行】
4、线程的实现
【利用QT的信号槽机制进行线程间通信;1、创建一个Othread 成员变量,将自定义的QObjectmovetothread;2、继承Qthread,重写run方法】
5、Q_Obuject宏定义都有些啥
static const QMetaObject staticMetaObject; \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
6、QT多线程如何交互
7、如何排查内存泄漏问题
【1、日志打印,统一程序中所有的动态申请和删除函数,重写new和delete【或者宏定义方法】,在函数中进行内存的打印;
2、VS的快照对比;3、windbg的内存分析、4,hook改写内存分配函数(没用过)】
避免方法:使用智能指,减少手动管理
8、如何排查界面卡顿问题
性能诊断工具,判断函数耗时
日志打印目标函数耗时
9、什么时候使用信号槽,什么时候使用事件,【使用控件时,使用信号槽;实现控件时,重写事件,处理事件】
应用程序对象将系统消息接收为Qt事件。应用程序可以按照不同的粒度对事件加以监控、过滤并做出响应。
广立微:
【1】QT的连接方式
【2】线程间的通信方式,对同一变量的读写,先后顺序如何保证【原子变量,条件变量控制,blockconnection】
【3】如何排查内存泄漏
【4】QVector和QList的区别
【QList 是一个基于指针数组的容器,存储的是指向实际元素的指针。QVector 是一个基于连续内存块的容器,类似于C++标准库中的 std::vector。】
【5】C++11有哪些新东西,用过哪些?(牛客常见面试题)
【6】lambda函数原理
【编写的lambda表达式回产生一个未命名类的未命名对象;此匿名类含有一个重载的函数调用运算符即重载括号()】
lambda是函数对象,引用捕获,需要确保引用对象确实存在,可以供lambda函数体直接使用修改;值捕获,值捕获需要在lambda这个匿名对象里面创建成员变量,
同时创建构造函数,使用捕获的数据变量来初始化数据成员;
lambda表达式产生的类不含默认构造函数、赋值运算符及默认析构函数;是否含有默认的拷贝\移动构造函数需要视捕获的成员变量而定。
【7】说说智能指针,share_ptr和weak_ptr的区别,底层原理;
【8】动态库导入的底层原理
【9】虚函数的原理,虚函数通过虚函数表和虚函数指针来实现类的多态,动态运行时调用对象的函数方法
【10】信号槽的原理
【11】QT的事件循环机制
【12】QVector和写时复制,是采用写时复制,isTooSmall 则告诉我们当前szie加 1 之后是否超出了当前容量(d->alloc),假设是相同须要调用 reallocData 開始申请内存。
因为内存分配可能是由写时复制策略调用,因此依据 isTooSmall 參数的不同。reallocData()的參数也不同。
【13】原子变量
富途的短面:
【1】QT信号槽有哪几种连接方式,信号槽机制
【2】需要在析构函数中调用disconnect吗?
【3】对象树和智能指针一起用,要注意什么
#富途面试##广立微##杭州近江科技有限公司#