函数指针和回调函数以及返回指向函数的指针

本文介绍了函数指针的概念,强调了在声明时必须明确其指向的函数类型。通过示例展示了如何使用函数指针调用函数,包括直接赋值和解引用调用。此外,探讨了函数指针作为形参实现的正向和反向调用,解释了回调函数的工作原理。最后,阐述了如何声明并返回指向函数的指针,指出必须显式声明返回类型为函数指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       函数指针指向的是函数而非对象。和其他类型一样,函数指针指向某种特定类型。因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明一个函数指针,只需要用指针替换函数名即可,例如:

比较字符串长度的函数:bool LengthCompare(const string &, const string &);

此函数的函数指针为:    bool (*pf)(const string &, const string &);

pf指向一个函数,函数的参数是两个const string的引用,返回值是bool类型。*pf两端的括号必不可少,如果不写会变成:

bool  *pf  (const string &, const string &);  此时pf是一个返回值为bool指针的函数。

 

函数指针的使用:

1、当把函数名作为一个值使用时,该函数自动地转换为指针。

pf = LengthCompare;            //pf指向名为LengthCompare的函数

pf = &LengthCompare;         //等价的赋值语句,取地址符是可选的

同时,直接使用指向函数的指针调用该函数时,无须提前解引用指针。

bool b1 = pf("hello", "world");                          //调用LengthCompare函数

bool b2 = (*pf)("hello", "world");                      //一个等价的调用

bool b1 = LengthCompare("hello", "world");   //另一个等价的调用

2、函数指针形参(正向调用和反向调用,反向调用即回调函数)

      利用函数指针形参,函数调用和任务的编写可以分开。这样的话,这要是这个函数类型的函数,传入不同的函数名,就能执行不同的函数体,用这种方法实现了类似于C++多态的形式。

        回调函数是利用函数指针实现的一种调用机制,回调机制原理: 当具体时间发生时,调用者通过函数指针调用具体函数,回调机制将调用者和被调函数分开,两者互不依赖。

        回调函数应用举例:

#include <iostream>
using namespace std;

typedef void (*callback)(int x);            // 定义一个函数指针类型

void myFunc1(int x)                         // myFunc1 的声明要与callback一样
{
    cout << "This is myFunc1 " << x << endl;
}

void myFunc2(int x)
{
    cout << "This is myFunc2 " << x << endl;
}
void callMyFunc(callback cb, int x)      // 把函数指针类型当做调用函数参数类型
{
    cb(x);
}

int main()
{
    callMyFunc(myFunc1, 1);
    callMyFunc(myFunc2, 2);

    return 0;
}

20180531214807408

3、返回指向函数的指针

       和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针,但是,我们必须把返回类型写成指针形式,因为编译器不能自动地将函数返回类型当成对应的指针的类型处理。声明返回函数指针的函数简单的办法就是使用类型别名。

        返回函数指针应用举例:

#include<iostream>

using namespace std;
using F = int(*)(int);


int a(int m){return m;}

F f1(){return a;}

int main()
{
    cout << "function a(10) vaule is: " << a(10) << endl;
    cout << "function f1()(5) vaule is: " << f1()(5) << endl;
    return 0;
}

20180531215426188

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值