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

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

C用函数指针模拟重载 C++重载

时间: 2024-12-10 07:50:10

C用函数指针模拟重载 C++重载的相关文章

C++中用成员函数指针模拟多态

1.成员函数指针的用法 1 #include <iostream> 2 using namespace std; 3 class base 4 { 5 public: 6 int test(int lhs,int rhs) 7 { 8 cout<<"base test"<<endl; 9 return 1; 10 } 11 }; 12 class derived:public base 13 { 14 public: 15 int test(int

函数重载(续)==》函数重载和函数指针在一起

函数重载与函数指针(这一块很重要,后续要继续学习): 当使用重载函数名对函数指针赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 #include <iostream> using namespace std; void myFunc(int a) {     printf("a:%d\n",a); } void myFunc(char *p) {     printf("p:%s\n",p); } v

C++对C语言的拓展(5)—— 函数重载和函数指针结合

1.函数指针的介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (*pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数.pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int.则

结构体中定义函数指针

转自:http://blog.csdn.net/unix21/article/details/9293877 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n }; 形式2:在定义类型的同时定义变量 struct结构体标识符 { 成员变量列表;… } *指针变量名;

小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧写一篇压压惊.把我文章抱走的同学留个言嘛. 函数在变成里面是一个非常重要的组成部分,那么这一部分我们先简单的介绍一下参数是如何传递进入函数,函数如何返回结果的.然后我们再来看看函数重载是个什么样的机制,最后在介绍一下所谓的函数指针到底是个什么东西.那么直接开始正题吧: 一.函数的参数传递 我们知道函

C++学习笔记(八):函数重载、函数指针和函数对象

函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处. 试想如果没有函数重载机制,如在C中,你必须要这样去做:为这个print函数取不同的名字,如print_int.print_string.这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型.char*.各种类型的数组等等.

23)函数重载和函数指针

1)第一中方式 我想调用我自己定义的函数,但是  我不想用我的函数名字,那么就可以这样   2)第二种方式: 定义一种指向这种函数类型的指针就可以 typedef int(*MY_FUNC_P)(int,int)--->这个MY_FUNC_P就是指向返回值类型是int,参数列表是(int,int)的函数指针 然后我调用: MY_FUNC_P fp=NULL: fp=func: fp(10,20)  这样就可以. 1 #include<iostream> 2 int func(int a,

c++-内联函数和函数重载和默认参数和函数指针

内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数. 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义.如果已定义的函数多于一行,编译器会忽略 inline 限定符. 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说

使用函数指针解决函数重载二义性调用问题

当实参对应重载函数的多个可行函数,且每个可行函数各自在一个实参上实现了更好的匹配时,编译器会因为程序具有二义性而报错. 例如: #include<iostream> using std::string; using std::cout; using std::cin; using std::endl; void ff(int, int) {//重载函数1 cout << "f1" << endl; } void ff(double, double =