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),作用是一样的。
适配的作用在这里没有效果,但是在复杂的功能实现里就非常有作用了。这里就不多说了,你用多了自然就体会到了。