函数指针做函数参数

  现以add函数为例,如下:

int add(int a,int b){
    printf("func....add:%d\n",(a+b));
    return a+b;
}

 通常定义一个函数指针类型,按如下格式即可调用:

typedef int (*MyFuncType)(int a,int b); //定义一个函数指针类型
MyFuncType myFuncType=add;
cout<<myFuncType(2,4)<<endl;

 或者直接定义一个函数指针

int (*p)(int a,int b);    //定义一个函数指针
p=add;
cout<<"调用函数指针:p : "<<p(4,5)<<endl;

 在对比了函数指针的特性时,会发现,定义一个函数指针类型的过程比定义一个函数指针要复杂的多。但是在编写代码的时候,就会发现函数指针类型的强大作用。

#include"iostream"
using namespace std;
/*
 * 函数指针类型起到的作用
 *      把函数的参数、函数的返回值提前做了约定。
 * 以达到任务的调用者与任务的实现者达到解耦合
 */
//子任务的执行者
int add(int a,int b){
    printf("func....add:%d\n",(a+b));
    return a+b;
}
int sub(int a,int b){
    printf("func....sub:%d\n",(a-b));
    return a-b;
}
int mut(int a,int b){
    printf("func....mutiply:%d\n",(a*b));
    return a*b;
}

//定义一个函数指针类型
typedef int(*MyFuncType)(int a,int b);

//函数指针做函数参数     间接调用
int function1(MyFuncType myFunctionType,int x,int y){
    myFunctionType(x,y);
}
int function2(int (*MyFuncType2)(int a,int b),int x,int y){
    int ret=MyFuncType2(x,y);
    return ret;
}

int main(){
    /*
    MyFuncType myFuncType = NULL;
    myFuncType=add;
    myFuncType(1,2);
    */
    //函数指针作为参数
    function1(add,8,8);
    function1(sub,8,8);
    function1(mut,8,8);
    function2(add,8,8);
    function2(sub,8,8);
    function2(mut,8,8);
    return 0;
}

 从中可以发现,一旦函数过多时,我们可以将函数的实现与函数的调用者分离,使得开发具有逻辑性,同时这也体现了类似多态的特性。

posted @ 2018-07-18 22:37  晓乎  阅读(2925)  评论(0编辑  收藏  举报
总访问: counter for blog 次