最近在看代碼,寫代碼的人很喜歡用回調函數和函數指針。一直以爲回調函數和函數指針挺神祕的,因此查了一些資料,來與你們一塊兒來分享。ios
簡而言之,回調函數就是一個經過函數指針調用的函數。若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用爲調用它所指向的函數時,咱們就說這是回調函數。程序員
由於使用回調函數能夠把調用者和被調用者分開,調用者不關心誰是被調用者,全部它需知道的,只是存在一個具備某種特定原型、某些限制條件(如返回值爲int)的被調用函數。回調函數就好像是一箇中斷處理函數,系統在符合你設定的條件時自動調用。windows
使用回調函數,咱們須要作三件事:app
聲明和定義時應注意,回調函數由系統調用,因此能夠認爲它屬於windows系統,不要把它看成你的某個類的成員函數。函數
回調函數是一個程序員不能顯示調用的函數,經過將回調函數的地址傳給調用者從而實現調用。回調函數是十分必要的,在咱們想經過一個統一接口實現不一樣的內容,這時回調函數很是合適。spa
對回調函數有了一個初步的瞭解,下面咱們來講一下函數指針。由於要實現回調,必須首先定義函數指針。.net
void (*) ()指針
左邊圓括弧中的星號是函數指針聲明的關鍵。另外兩個元素是函數的返回類型(void)和右邊圓括弧中的入口參數code
爲函數指針聲明類型定義:blog
Typedef void(* pfv)()
pfv 是一個函數指針,它指向的函數沒有輸入參數,返回類型爲void。使用這個類型定義名稱能夠隱藏負責的函數指針語法。
void func()
{
cout << "func執行" << endl;
}
這裏的函數定義,函數的返回值類型以及形參類型必須與聲明的一致,可是函數的功能能夠不一樣。
void callback(pfv p)
{
cout << "callback running!" << endl;
p();
}
#include <iostream>
using namespace std;
/*-------------- 不帶參數的函數 -------------*/
// 函數聲明
typedef void (*pfv)();
// 函數的定義
void func()
{
cout << "func is running!" << endl;
}
void func1()
{
cout << "func1 is running!" << endl;
}
// 設置觸發條件
void callback(pfv p)
{
cout << "callback is running!" << endl;
p();
cout << "-------------------------" << endl;
}
/*---------------帶參數的函數-----------------*/
// 函數聲明
typedef void (*pF)(int);
// 函數的定義
void fun(int x)
{
cout << "fun: " << x << endl;
}
void test(int x)
{
cout << "test: " << x << endl;
}
// 設置觸發條件
void callbackc(pF p, int x)
{
cout << "callbackc is running!" << endl;
p(x);
cout << "-------------------------" << endl;
}
int main()
{
/*------ 不帶參數--------*/
pfv p1 = func;
callback(p1);
p1 = func1;
callback(p1);
/*------- 帶參數---------*/
pF p2 = fun;
int x = 3;
callbackc(p2,x);
p2 = test;
x = 4;
callbackc(p2,x);
return 0;
}
參考:http://www.cppblog.com/SpringSnow/archive/2008/12/07/68770.aspx