当前位置:C++技术网 > 资讯 > 函数的形参是函数指针,能设置默认值吗?如果能应该怎么写

函数的形参是函数指针,能设置默认值吗?如果能应该怎么写

更新时间:2018-05-12 23:16:53浏览次数:1+次

函数的形参是函数指针,能设置默认值吗?如果能应该怎么写

C++技术网会员解答:

     您给的示例如下:

typedef int (*add_fuc)(int,int);
int  LoadFuc(int &ValueA,int &ValueB,add_fuc add(int i,int t)){
      //ValueA=df(6,8); 
return 0;
}

问题是:编译是通的,就是不知道啥意思,也没想明白。
    那么我来给你解释一下,然后你就明白了。
    typedef是重命名类型的名称,也就是给已知类型定义一个别名。那么此处的typedef自然也是定义出一个类型别名。具体是什么类型呢?如果觉得复杂,我们再进一步看。

    给一个简单的示例:

typedef int myint;
    这是给int类型一个新名字的代码。使用myint和使用int一模一样。

    语句:typedef int (*add_fuc)(int,int);  ,就是定义了一个函数类型,就好比int类型一样。作为一个类型,就可以拿去定义变量。所以add_fuc可以这样用:

add_fnc aa;//定义一个函数变量
    只不过aa是一个没有实现体的函数指针,就好像是一个无效的指向int变量的指针一样。有点绕口。所以你示例上给的参数的传递方式是错误的,所以才让你觉得无法使用。虽然可以编译通过,但是是个什么鬼,好像一下子没有看出来!我也不知道,反正语法是编译通过了。

    那么你就把这个定义看做一个普通的形式参数传递就很好理解了。

    如果依然觉得有点难以理解,那么就是函数指针这一块需要学习一下,来仔细了解一下函数指针的含义和定义方式,更主要是熟悉函数指针的表示形式,这是语法。没有什么好说的,你需要看书掌握。

    下面给你一个完整的例子,我是调试通过了的。这种用法也是很常见的,一般叫做适配器,STL和Boost里面经常用到。示例如下:

#include <stdio.h>
typedef int(*add_fuc)(int, int);
typedef int myint;

int add2(int a, int b)
{
    printf("a+b=%d\n",a+b);
    return 0;
}

int  LoadFuc(int ValueA, int ValueB, add_fuc add = add2)
{
    add(ValueA, ValueB);
    return 0;
}

int main()
{
    LoadFuc(12, 13);
    return 0;
}
    这样看来是不是就清楚明白了,函数类型add_fuc,形式变量是add,默认赋值是add2函数。add2函数在前面定义好了。add2函数的类型即函数参数和返回值类型都是函数类型add_fuc定义的那样。add作为一个函数,直接可以调用,所以在LoadFuc里面直接可以调用参数里的add。而传递给add的参数只是LoadFuc前面两个普通的参数而已。

    所以LoadFuc最后实际上没有自己实现什么功能,而是将参数传递进去再转给了第三个参数的函数,而第三个参数所用的函数也就是你可以随时指定的函数,这样LoadFuc也就只是起到一个适配的作用。你直接可以用add(12,13)来代替LoadFuc(12,13),作用是一样的。

    适配的作用在这里没有效果,但是在复杂的功能实现里就非常有作用了。这里就不多说了,你用多了自然就体会到了。