信号槽机制与回调函数的区别


前两天面试被问到了这么一个问题:

信号与槽和回调函数之间有什么区别?

我当时回答的是我感觉区别不大,可能也是长时间没有编码或者没有参加过面试,猛的一问还真想不起来了,刚刚突然想起来就在网上搜了一下。对于这方面的解释不太多,大部分人也说不出个来龙去脉。我挑了一下大概就下面两位讲解的可以说即保持客观有掺杂着一些自己的理解。

https://blog.csdn.net/m0_37806112/article/details/83933268

第一位老哥我感觉是理解比较深刻的,他总结说回调函数的本质是“你想让别人的代码执行你的代码,而别人的代码你又不能动”这种需求下产生的。

①回调函数使用函数指针来实现的,如果多个类都关注一个类的动态变化,这样就会需要写出一个比较长的列表来管理这些类之间的关系。稍微在编码方面不那么灵活,稍显冗余。

②QT使用信号与槽来解决这个连接问题,这种方式比较清晰简单一些,一个类只需要清楚自己有几个槽函数有几个信号,然后将信号与槽进行连接,QT会自己处理函数的调用关系。这样在软件设计角度更加的清晰,灵活,不容易出错。

③Qt信号与槽机制降低了Qt对象的耦合度。发信号的对象不需要知道有几个槽函数,也不需要关系是否收到信号,或者谁收到了,谁没收到。同样的槽函数也不需要知道谁是信号的发出者。信号只需要在合适的时机发出即可,降低了对象之间的耦合度。

https://blog.csdn.net/weixin_39504171/article/details/94613279?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ELandingCtr%7Edefault-1.queryctrv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ELandingCtr%7Edefault-1.queryctrv2&utm_relevant_index=2

第二位老哥主要是根据MFC与QT之间的区别来讲的,以鼠标按下举例:

1.在"点击鼠标这个动作转到click"这个过程中, QT应用了事件机制(一个对象的事件处理函数属于它的成员函数) ,执行"按鼠标"后通过事件过滤器过滤、执行事件,最终发送一个click信号;而MFC通过消息喊应机制,将"按鼠标"和click函数通过宏联系起来。

2.在"执行click对应的相关操作"这个过程中, QT应用了信号槽机制,通过接收到click信号后执行与的槽函数,完成相应操作;而MFC直接执行click函数内白过程相当于一个回调。

中心思想就是QT在整个函数调用执行过程中增加了信号处理的概念,使用一个信号来调用所有槽函数,而MFC是直接执行回调函数的内容。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM