前兩天面試被問到了這么一個問題:
信號與槽和回調函數之間有什么區別?
我當時回答的是我感覺區別不大,可能也是長時間沒有編碼或者沒有參加過面試,猛的一問還真想不起來了,剛剛突然想起來就在網上搜了一下。對於這方面的解釋不太多,大部分人也說不出個來龍去脈。我挑了一下大概就下面兩位講解的可以說即保持客觀有摻雜着一些自己的理解。
https://blog.csdn.net/m0_37806112/article/details/83933268
第一位老哥我感覺是理解比較深刻的,他總結說回調函數的本質是“你想讓別人的代碼執行你的代碼,而別人的代碼你又不能動”這種需求下產生的。
①回調函數使用函數指針來實現的,如果多個類都關注一個類的動態變化,這樣就會需要寫出一個比較長的列表來管理這些類之間的關系。稍微在編碼方面不那么靈活,稍顯冗余。
②QT使用信號與槽來解決這個連接問題,這種方式比較清晰簡單一些,一個類只需要清楚自己有幾個槽函數有幾個信號,然后將信號與槽進行連接,QT會自己處理函數的調用關系。這樣在軟件設計角度更加的清晰,靈活,不容易出錯。
③Qt信號與槽機制降低了Qt對象的耦合度。發信號的對象不需要知道有幾個槽函數,也不需要關系是否收到信號,或者誰收到了,誰沒收到。同樣的槽函數也不需要知道誰是信號的發出者。信號只需要在合適的時機發出即可,降低了對象之間的耦合度。
第二位老哥主要是根據MFC與QT之間的區別來講的,以鼠標按下舉例:
1.在"點擊鼠標這個動作轉到click"這個過程中, QT應用了事件機制(一個對象的事件處理函數屬於它的成員函數) ,執行"按鼠標"后通過事件過濾器過濾、執行事件,最終發送一個click信號;而MFC通過消息喊應機制,將"按鼠標"和click函數通過宏聯系起來。
2.在"執行click對應的相關操作"這個過程中, QT應用了信號槽機制,通過接收到click信號后執行與的槽函數,完成相應操作;而MFC直接執行click函數內白過程相當於一個回調。
中心思想就是QT在整個函數調用執行過程中增加了信號處理的概念,使用一個信號來調用所有槽函數,而MFC是直接執行回調函數的內容。