• 认真地记录技术中遇到的坑!

杂记:回调函数

C/C++ Moxun 2年前 (2018-01-15) 555次浏览 0个评论

1.回调函数
回调函数,顾名思义就是使用者根据函数原型的要求自己定义一个函数,并实现它,然后把这个函数当做参数传入别人(或者系统)的函数中,由别人(或系统)的函数在运行时调用的函数。回调函数本身是由你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式来调用的函数。简单来说就是由别人的函数在运行期间来回调你的函数。
2.函数指针
函数指针是指向函数的指针变量,所以它首先是个指针,其次它指向的对象是函数。
假设有函数原型:
void print(string strParam);
那么这个函数原型对应的函数指针是:
void (pPrint)(string strParam);
可以看到函数指针和函数申明的区别在,我们使用(
pPrint)这个指针替代了函数名称(print),调用函数时我们使用函数指针做如下调用:
pPrint(“Hello World”);
(pPrint)(“Hello World”);
函数指针可以不解引用就使用,这里的道理类似于数组和指针的关系,我们在使用函数名的时候,函数名实际上被转换为了指针。
因此,我们可以对函数指针做这样的初始化:
void (
pPrint)(string strParam) = print;
或者做如下赋值操作:
pPrint = print;

    如果函数指针在定义时没有被初始化,那么它指向一类返回值类型、形参列表严格匹配的函数族。

3.函数指针和回调函数:
回调函数的本质是函数指针,它的特殊之处在于,这个函数指针是在运行时被当做参数传递到其它函数去的,由其它函数负责通过传递过来的函数指针来调用这个函数。示例如下:
“`cpp
#include
#include
#include

using namespace std;

void printHelloWorld(void (*pPrint)(string),string strParam);

void print(string strParam);

int main(int argc,char *argv[])
{
printHelloWorld(print,”Hello World”);
system(“pause”);
return EXIT_SUCCESS;
}
void print(string strParam)
{
cout << strParam << endl;
}

void printHelloWorld(void(*pPrint)(string),string strParam)
{
pPrint(strParam);
}
“`注:普通回调成员函数不能做回调函数,如果想要使成员函数做回调函数那么需要把成员函数声明为static的,理由是类内部调用成员(无论是方法还是属性,都是通过一个隐含的this指针来调用的,this->成员,但是回调函数则是通过参数传递过来的指针来寻址函数,这样就违背了this->成员的原则)


转载请注明出处 杂记:回调函数
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址