C++基础整理(8)之函数指针与回调函数

C++基础整理(8)之函数指针与回调函数

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构



提示:本文为 C++ 中 函数指针、回调函数 的用法和举例


一、函数指针

  在C++中,函数指针是一个指向函数的指针,它存储了函数的地址而不是函数的返回值。函数指针的主要用途是允许程序员在运行时动态地调用不同的函数,或者将函数本身作为参数传递给其他函数。

1、函数指针的声明和初始化

声明函数指针的格式return_type (*funPtr)(paras_type),即用(*函数指针的名字)代替原函数定义时给函数取的名字,然后参数列表中只写参数的数据类型。

以下是一个简单的定义声明一个指向无参数、无返回值函数的指针:

void (*functionPtr)();
functionPtr = myfun;//初始化这个函数指针,赋以已经定义的函数myfun

如果函数接受参数或返回值,你需要在函数指针的定义中包括这些参数和返回类型。

例如,指向接受一个整数参数并返回整数的函数的指针的定义:

int (*functionPtrWithInt)(int);
functionPtrWithInt = myfun2;//初始化这个函数指针,赋以已经定义的函数myfun2

注意,以上在C++引入<functional>库后也可以写成:std::function<int(int)> functionPtrWithInt = myfun2;这个功能更加灵活。

2、使用 typedef 定义函数指针的类型

可以将函数指针当成一个新的数据类型,这时仅需将函数指针的声明格式前面加一个 typedef 即可,注意这时括号内的FunctionPtr不再是一个函数指针,而是一个函数指针的类型。
以下是个示例可以比较一下与刚才函数指针初始化的区别。

// 使用typedef定义函数指针类型  
typedef int (*FunctionPtr)(int);  
// 用这个类型声明一个函数指针变量  
FunctionPtr fPtr;  
// 初始化这个函数指针,赋以已经定义的函数myfun2  
fPtr = myfun2;  

注意以上写法在C++中也可以用关键字 using 代替:

// 使用using定义函数指针类型  
using FunctionPtr = int (*)(int);  

注意:int (*s[N])(int) 表示一个函数指针的数组,N个元素都是函数指针,且每个指针都指向某个参数是int,返回是int的函数(不一定是同一个函数)。

3、函数指针的用途

(1)回调函数:在异步编程或事件驱动编程中,我们常常需要将函数指针作为回调,以便在某个事件发生时调用特定的函数。

(2)将函数作为参数传递,因为函数名在大多数情况下会被解释为指向该函数的指针,所以能够直接将函数名作为参数传递给接受函数指针的函数。

(3)函数表:可以创建函数指针数组(或称为函数表),以在运行时根据某些条件选择并执行不同的函数。

(4)高级功能:如虚函数表(在C++的对象模型中用于实现多态)、信号处理函数等内部机制都依赖于函数指针。

4、通过函数指针将函数作为参数传递

下面是一个简单的例子,展示了如何将函数作为参数传递:

// 定义一个函数,它接受一个函数指针作为参数
void callFunction(void (*func)()) {
   
    func(); // 调用传入的函数
}

// 定义一个普通的函数
void sayHello() {
   
    std::cout << "Hello from sayHello!" << std::endl;
}

int main() {
   
    // 将函数名(它隐式地转换为函数指针)作为参数传递给callFunction
    callFunction<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值