回調函數

1、前言

最近在看代碼,寫代碼的人很喜歡用回調函數和函數指針。一直以爲回調函數和函數指針挺神祕的,因此查了一些資料,來與你們一塊兒來分享。ios

一、什麼是回調函數

     簡而言之,回調函數就是一個經過函數指針調用的函數。若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用爲調用它所指向的函數時,咱們就說這是回調函數。程序員

二、爲何要使用回調函數

      由於使用回調函數能夠把調用者和被調用者分開,調用者不關心誰是被調用者,全部它需知道的,只是存在一個具備某種特定原型、某些限制條件(如返回值爲int)的被調用函數。回調函數就好像是一箇中斷處理函數,系統在符合你設定的條件時自動調用。windows

三、如何使用回調函數

   使用回調函數,咱們須要作三件事:app

  • 聲明
  • 定義
  • 設置觸發條件:在你的函數種把你的回調函數名稱轉化爲地址做爲一個參數,以便於系統調用。

     聲明和定義時應注意,回調函數由系統調用,因此能夠認爲它屬於windows系統,不要把它看成你的某個類的成員函數。函數

    回調函數是一個程序員不能顯示調用的函數,經過將回調函數的地址傳給調用者從而實現調用。回調函數是十分必要的,在咱們想經過一個統一接口實現不一樣的內容,這時回調函數很是合適。spa

2、例子

一、函數的聲明

對回調函數有了一個初步的瞭解,下面咱們來講一下函數指針。由於要實現回調,必須首先定義函數指針。.net

void (*) ()指針

左邊圓括弧中的星號是函數指針聲明的關鍵。另外兩個元素是函數的返回類型(void)和右邊圓括弧中的入口參數code

爲函數指針聲明類型定義:blog

Typedef void(* pfv)()

pfv 是一個函數指針,它指向的函數沒有輸入參數,返回類型爲void。使用這個類型定義名稱能夠隱藏負責的函數指針語法。

二、函數的定義

void func()
{
   cout << "func執行" << endl;
}

這裏的函數定義,函數的返回值類型以及形參類型必須與聲明的一致,可是函數的功能能夠不一樣。

三、設置觸發條件

void callback(pfv p)
{
   cout << "callback running!" << endl;
   p();
}

3、代碼實現

#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

        http://my.oschina.net/kaixindewo/blog/16320

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息