首页 > 代码库 > 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; }

这种方法的局限性:模拟的重载函数参数个数必须是相同的切返回值相同。因为定义的是一个函数指针,函数指针定义就明确了其参数个数返回值。