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】对象树和智能指针一起用,要注意什么

#富途面试##广立微##杭州近江科技有限公司#
全部评论

相关推荐

点赞 评论 收藏
分享
06-06 17:12
已编辑
University of California Irvine C++
经历了人生中最恐怖的拷打,jd上看这是个做分布式存储的岗,但是怎么一点分布式不问啊,我白看了两天的raft算法1. 自我介绍2. 说下c++17和20的特性3. 说下内存泄漏和悬垂指针 4. 说下进程和线程的区别,再说下协程5. 说下const和constexpr6. 一个函数中有 uint 和 int 两个变量,他们进行加减操作会有什么问题吗,如果说左值是double或者float,他们会进行类型转换吗7. 一个类的成员如果没有初始化会怎么样,对于基础类型,自定义类,static修饰的变量都说一下8. 为什么NUMA要绑定线程到节点,两个不同节点的线程如果要传输一个数据怎么办,会不会造成缓存miss9. 说一下线程池的设计10. 为什么项目定时器要用红黑树呢,有没有O(1)复杂度的数据结构,其他实现有哪些,红黑树和堆排序的区别(不会11. 讲一下数组和链表的区别,遍历的话哪个更快12. 双缓冲区的日志库是怎么做的,如果一个线程还没来得及将内容写到磁盘就要交换缓冲区了怎么办,另外其他线程怎么把日志同步给日志库的线程 13. 讲一下io uring,说一下io uring中的提交函数14. 线程之间可以怎么同步/传输数据,如果要共享数据呢15. 左值和右值16. c++如果函数参数不确定可以怎么写,只知道用template的…17. 动态规划和分治算法的区别算法 一个长度为100的int数组,如果把每 10bit 看作一个数字,那么怎么得到第 n 个数字 比如一个 4,二进制就是 0100,因为int是32位,所以在 0100 前面还有28个0,将每10位看作一个数算法没写出来,思路好像也不对,感觉底裤都被扒掉了,最后也没有反问环节就耻辱下播了-- 更新,答成这样都给我进二面了?
虾皮信息一面336人在聊 查看18道真题和解析
点赞 评论 收藏
分享
评论
3
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务