• 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;
     }

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

  • 相关阅读:
    Java第七次作业
    JAVA第六次作业
    JAVA第五次作业
    JAVA第四次作业
    JAVA第三次作业
    JAVA第二次作业
    Java第一次作业
    2017《Java》预备作业02 计科1501刘喆
    2017《JAVA》预备作业 计科1501刘喆
    Java第十次作业--多线程
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/3911952.html
Copyright © 2020-2023  润新知