首頁>Club>
14
回覆列表
  • 1 # 使用者7305050034042

    1.回撥函式是一個很有用,也很重要的概念。當發生某種事件時,系統或其他函式將會自動呼叫你定義的一段函式。

    2.回撥函式就相當於一箇中斷處理函式,由系統在符合你設定的條件時自動呼叫。為此,你需要做三件事:1,宣告;2,定義;3,設定觸發條件,就是在你的函式中把你的回撥函式名稱轉化為地址作為一個引數,以便於系統呼叫。

    3.所謂回撥函式就是按照一定的形式由你定義並編寫實現內容,當發生某種事件時,而由系統或其它函式來呼叫的函式。使用回撥函式實際上就是在呼叫某個函式時,將自己編寫的一個函式的地址作為引數傳遞給那個函式。而那個函式在需要的時候,也就是某種事情發生的時候,利用傳遞的函式地址呼叫回撥函式,這時你可以利用這個機會在回撥函式中處理訊息或完成一定的操作。回撥函式只能是全域性函式,或者是靜態函式,因為這個函式只是在這個類中使用,所以為了維護類的完整性,我們用類的靜態成員函式來做回撥函式。

    4.對於很多初學者來說,往往覺得回撥函式很神秘,很想知道回撥函式的工作原理。本文將要解釋什麼是回撥函式、它們有什麼好處、為什麼要使用它們等等問題,在開始之前,假設你已經熟知了函式指標。

    (1)什麼是回撥函式?

    簡而言之,回撥函式就是一個透過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是回撥函式。

    (2)為什麼要使用回撥函式?

    因為可以把呼叫者與被呼叫者分開。呼叫者不關心誰是被呼叫者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被呼叫函式。

    如果想知道回撥函式在實際中有什麼作用,先假設有這樣一種情況,我們要編寫一個庫,它提供了某些排序演算法的實現,如氣泡排序、快速排序、shell排序、shake排序等等,但為使庫更加通用,不想在函式中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,想讓庫可用於多種資料型別(int、float、string),此時,該怎麼辦呢?可以使用函式指標,並進行回撥。

    回撥可用於通知機制,例如,有時要在程式中設定一個計時器,每到一定時間,程式會得到相應的通知,但通知機制的實現者對我們的程式一無所知。而此時,就需有一個特定原型的函式指標,用這個指標來進行回撥,來通知我們的程式事件已經發生。實際上,SetTimer()API使用了一個回撥函式來通知計時器,而且,萬一沒有提供回撥函式,它還會把一個訊息發往程式的訊息佇列。

    另一個使用回撥機制的API函式是EnumWindow(),它列舉螢幕上所有的頂層視窗,為每個視窗呼叫一個程式提供的函式,並傳遞視窗的處理程式。如果被呼叫者返回一個值,就繼續進行迭代,否則,退出。EnumWindow()並不關心被呼叫者在何處,也不關心被呼叫者用它傳遞的處理程式做了什麼,它只關心返回值,因為基於返回值,它將繼續執行或退出。

    不管怎麼說,回撥函式是繼續自C語言的,因而,在C++中,應只在與C程式碼建立介面,或與已有的回撥介面打交道時,才使用回撥函式。除了上述情況,在C++中應使用虛擬方法或函式符(functor),而不是回撥函式。

  • 中秋節和大豐收的關聯?
  • 明朝浙西四賢“蘇坦妹”的蘭溪會辦成了嗎?她是怎麼死的?