^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

date: 20180811

回调函数:就是一个通过函数指针调用的函数。如果你把函数的指针作为参数传递给另外一个函数,档这个指针被用来调用其指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一个调用,用于对该事件或条件进行的响应。

函数指针:

返回值 (*函数名)(参数列表);

如:int (*callback)(int i);

1. typedef定义函数指针类型

#include <iostream>

using namespace std;

typedef int (*fp)(char c);

int f0 (char c) { cout << "f0, c= " << c << endl; return 0; };
int f1 (char c) { cout << "f1, c= " << c << endl; return -1; };

int main ()
{
    fp Fp;
    Fp = f0;
    cout << Fp ('a') << endl;
    system ("pause");
    Fp = f1;
    cout << Fp ('b') << endl;
    system ("pause");

    return 0;
}

输出:

2. typedef定义函数类型

#include <iostream>

using namespace std;

typedef int f(char c);

int f0 (char c) { cout << "f0, c= " << c << endl; return 0; };
int f1 (char c) { cout << "f1, c= " << c << endl; return -1; };

int main ()
{
    f *Fp;
    Fp = f0;
    cout << Fp ('a') << endl;
    system ("pause");
    Fp = f1;
    cout << Fp ('b') << endl;
    system ("pause");

    return 0;
}

 输出:

——————————————————————

回调函数有什么作用呢?

1. 回调函数就是由用户自己做主的函数:

比如,OnTimer()定时器的回调函数,当时间到了需要做什么完全交给用户自己处理

2. 回调函数很有可能是输入输出的一种方式:

对于DLL来说,函数的参数由输入参数,输出参数。回调函数的指针作为其参数的话,可以起到输入的作用。当然,也可以起到输出的作用。

通过回调函数,可以一次又一次频繁的传递值——比如视频流。

3. 回调函数里面的实现,仍然可以是回调函数。

总之,回调函数的作用:

>. 决定权交给客户端

>. 与客户端进行交流

>. 通过客户端进行输入

>. 通过客户端进行输出

实例:

#include <iostream>

using namespace std;

typedef int (*CallbackFun)( char *p_ch );

int AFun (char *p_ch)
{
    cout << "Afun 回调:\t" << p_ch << endl;
    return 0;
}

int BFun (char *p_ch)
{
    cout << "BFun 回调:\t" << p_ch << endl;
    return 0;
}

int Call (CallbackFun p_Callback, char *p_ch)
{
    cout << "call 直接打印出字符:\t" << p_ch << endl;
    p_Callback (p_ch);
    return 0;
}

int Call2 (char *p_ch, int (*pfun)(char *))
{
    cout << "通过指针方式执行回调函数。。。" << endl;
    ( *pfun )( p_ch );
    return 0;
}

int Call3 (char *p_ch, CallbackFun p_Callback)
{
    cout << "通过命名方式执行回调函数。。。" << endl;
    p_Callback (p_ch);
    return 0;
}

int main ()
{
    char *p_ch = "Hello world!";
    Call (AFun, p_ch);
    Call (BFun, p_ch);

    Call2 (p_ch, AFun);

    Call3 (p_ch, AFun);
    system ("pause");

    return 0;
}

输出:

——————————————————————

posted on 2018-08-11 15:26  xiawuhao2013  阅读(3551)  评论(0编辑  收藏  举报