首页 > 代码库 > C用函数指针模拟重载 C++重载
C用函数指针模拟重载 C++重载
C中为什么不支持重载,即同一作用域内不允许出现同名函数?
我们都知道重载是c++面向对象的特性。c语言中是不存在的。所谓重载简单来说就是一个函数名可以实现不同的功能,要么输入参数不同或者参数个数不同,要么返回类型不同。例如函数add(),在c++中可以轻易实现int,double等不同类型参数的相加功能,而在c语言中却不能这样实现。c语言中实现重载功能,或者准确来说是类似重载的功能,可以通过函数指针的方式来实现。
函数指针定义
形式1:函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表
形式2:typedef函数类型 (*指针变量名)(形参列表);
区别: typedef的功能是定义新的类型。后面可以用新类型定义函数指针变量,第一种只能用定义函数指针时的名字。
例如:
1 int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
2 int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f fa;
fa=func; /* 将func函数的首地址赋给指针f */
函数指针赋值:赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
函数指针调用:
(*f)();
f(x);
函数调用的时候可以使用函数指针的方式,也可以使用函数指示符的方式。不过,后者会由编译器自动转换为前者的形式,即函数指针的形式。和指向对象的指针相比,这是函数指针一个比较特殊的地方。
区别指针函数:一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。
类型标识符 *函数名(参数表) int *f(x,y);
#include <stdio.h>typedef struct _int_param { int param1; int param2;}INT_PARAM;typedef struct _double_param_ { double param1; double param2;}DOUBLE_PARAM;typedef void* (*ADDFUNC)(void*);void* int_add_func(void* wParam){ INT_PARAM* lParam = (INT_PARAM*)wParam; int res = lParam->param1 + lParam->param2; return (void*)&res;}void* double_add_func(void* wParam){ DOUBLE_PARAM* lParam = (DOUBLE_PARAM*)wParam; double res = lParam->param1 + lParam->param2; return (void*)&res;}void* add_func(ADDFUNC f, void* wParam){ return f(wParam);}int main(){ INT_PARAM val1 = {10, 20}; DOUBLE_PARAM val2 = {30.5, 40.5}; void* res1 = add_func(int_add_func, &val1); int result1 = *((int*)res1); void* res2 = add_func(double_add_func, &val2); double result2 = *((double*)res2); printf("%d %f",result1,result2); return 0; }
这种方法的局限性:模拟的重载函数参数个数必须是相同的切返回值相同。因为定义的是一个函数指针,函数指针定义就明确了其参数个数返回值。