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

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

比较字符串长度的函数: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;
}


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;
}



猜你喜欢

转载自blog.csdn.net/hzqgangtiexia/article/details/80529723
今日推荐