回调函数本质上就是普通的函数,就是给起了一个高大上的名字。
首先函数是可以作为函数的参数来传递的。
void func()
{
std::cout << "叫我胖宁大王" << std::endl;
}
void pna(void (*function)())
{
std::cout << "开始了!!!" << std::endl;
function(); // 调用传入的函数
std::cout << endl;
}
int main()
{
pna(func); // 调用 pna 函数,并传递 func 作为参数
return 0;
}
func是一个简单的函数,它打印一行文本。pna
接受一个无参数无返回值的函数指针 function
。在 pna
函数内部,它首先打印 "开始了!!!",然后调用传入的函数 function
,最后打印 "结束了!!!"。
在 main
函数中,func
作为参数传递给 pna
,这就使得 func
成为了一个回调函数。pna
在适当的时机(即在其内部的某个点)调用了这个回调函数。
#include <iostream>
// 回调函数
void func(void* arg)
{
std::cout << "叫我胖宁大王" << std::endl;
int num = *(static_cast<int*>(arg));
std::cout << num << std::endl;
}
int main()
{
int* p = new int(5); // 动态分配一个整数,并初始化为 5
void pna(void (*function)(void* arg), void* arg)
{
std::cout << "开始了!!!" << std::endl;
function(p); // 调用传入的函数,并传递 p 作为参数
std::cout << "结束了!!!" << std::endl;
}
// 调用pna,并传递 func 作为参数
pna(func,p); // 传递 func 函数和 p 作为参数
delete p; // 清理动态分配的内存
return 0;
}
在这个示例中:
-
func
是一个回调函数,它接受一个void*
类型的参数,并将其转换为int*
类型,然后输出该整数的值。 -
pna
是一个中间函数,它接受一个回调函数function
并调用它,同时传递void*
类型的参数p
。 -
在
main
函数中,创建了一个指向整数的指针p
,并在构造时初始化其值为 5。 -
调用
pna
函数,并将func
作为参数传递给它。注意,在pna
函数内部调用function
时,传递了p
作为参数。 -
释放动态分配的内存
delete p;
。