回调函数:通过函数指针由某个函数在特定场合下调用指针指向的函数,这个过程叫回调函数

将函数的指针(地址)作为参数传递给另一个函数,当这个指针用来调用其所指向的函数时,便是回调函数。

回调函数不由函数者(程序员)实现直接调用,而是在特定环境下由其他函数调用,用于对该事件或条件进行响应。

场景:程序员不好手工调用某函数时,交给其他函数控制时机调用该函数。

c/c++中回调函数的用法:
1.定义一个函数
void func()
{
cout<<"…"<<endl;
}
2.定义一个函数指针
格式:返回值 (*指针名)(参数类型,参数类型);
void (*p)(); //这里这个函数名叫p,指针可以用来被指向一个无返回值,无参数的函数
3.函数指针指向对应格式的函数 //可在其他函数中调用
p = func;
4.通过函数指针调用其指向的函数
p();//函数指针调用函数的这一步叫做回调函数

要定义一个函数指针数组的话,
格式为
void (*func[5])(); //每个成员都是一个函数指针
初始化可以是
void(*func[5])() = { dofunc1, dofunc2, dofunc3 };

函数指针作为函数参数:

void work(void (*p)())
{
///////
p();
///////
}
void work(void (*p[])(),int n/*数组长度*/)
{
////////////
p[0]();
/////////////
p[1]();
//////////
p[n-1]();
///////////
}

被其他函数调用时

int main()
{
void (*p)() = func;
work(p);
return 0;
}

当一个函数有参数是函数指针类型时,该函数就可以通过直接传入同类型的函数名来调用控制调用其他函数。

int main()
{
work(func);//省略函数指针指向func这一步,正常运行。
return 0;
}

函数指针变成回调函数的方法
使用typedef和函数指针语法形成回调函数关键字。
例子:
函数指针的入参和返回值决定回调函数的入参和返回值,

typedef void(*callback)(int,int);//此后callback就变成了一个可以用来定义回调函数对象的关键字
callback mcbk(int value1, int value2)
{
//
//
//
}

全局函数赋值为函数指针和成员函数赋值为函数指针的方法有所不同。
1、全局函数的复制方式比较简单,上面例子就是,
2、成员函数必须是static显式修饰的静态成员函数,以确保函数指针调用时不会因类对象不存在而导致运行报错,且赋值给函数指针时须在成员函数前面加上:&类名::

class Obj
{
public:
	static void StaticShout()
	{
		cout << "Static成员函数Obj::Shout()被调用" << endl;
	}
};

void Shout()
{
	cout << "全局函数Shout()被调用" << endl;
}

void func()
{
	void (*pFunc)();
	//成员函数赋值为函数指针
	pFunc = &Obj::StaticShout;
	pFunc();

	//全局函数赋值为函数指针
	pFunc = Shout;
	pFunc();
}

int main()
{
	func();
	return 0;
}

运行结果:
在这里插入图片描述

更多推荐