今天面试了2家公司,还算可以吧,明天还得去西站接我朋友,下午还得继续面试,今天回来好累啊,我知道找工作是很辛苦的,加油吧,但是再累博客也得更新吧,因为今天不更新的话,明天也不会更新了,还是最好不开这个头,找一个小的知识点,探讨一下:回调函数。
在看回调函数之前,要先理解函数指针的概念,在我的博客:函数指针与函数指针数组的使用方法——http://blog.csdn.net/feitianxuxue/article/details/7300291里面有阐述的。
回调函数,顾名思义,就是使用者自己定义一个函数,使用者自己实现这个函数的程序内容,然后把这个函数作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是回调函数。
简单的说,就是由别人的函数运行期间来回调你实现的函数。
常见的例子是这样的:使用者在系统中调用一个系统函数,然后这个系统函数再回调使用者自己定义的一个函数。
下面来实现一个简单的回调函数:通过修改Hello World程序的例子来实现自己的回调函数。
标准Hello World程序:
int _tmain(int argc, _TCHAR* argv[]) { cout<<"Hello World"<<endl; system("pause"); return 0; }
将之修改成如下函数回调的样式来达到Hello World的效果。
#include <iostream> using namespace std; void settext() //在此定义实现“回调函数” { cout<<"Hello World"<<endl; } void enumfunc(void(*enumchild) ()) //在此定义实现回调函数的“调用函数” { enumchild(); } int _tmain(int argc, _TCHAR* argv[]) { enumfunc(settext); //在main主函数中实现函数回调 system("pause"); return 0; }
这是一个简单的回调函数的例子,在定义了“回调函数”和实现回调函数的“调用函数”后,就轻松实现了需要的函数回调。上面的demo是不带参数的回调函数,下面把上面的例子修改成带参数的回调函数。
#include <iostream> using namespace std; void settext(char* s) //定义带参的“回调函数” { cout<<s<<endl; } void enumfunc(void(*enumchild) (char*),char*s) //定义带参数的回调函数的“调用函数” { enumchild(s); } int _tmain(int argc, _TCHAR* argv[]) { enumfunc(settext,"Hello World!"); //在main主函数中实现带参数的函数回调 system("pause"); return 0; }
参考资料:《c++编程关键路径》 中国水利水电出版社 梁永军著 P100-P103