博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C用函数指针模拟重载 C++重载
阅读量:5241 次
发布时间:2019-06-14

本文共 1898 字,大约阅读时间需要 6 分钟。

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

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

转载于:https://www.cnblogs.com/Yogurshine/p/3911952.html

你可能感兴趣的文章
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
Android实现静默安装与卸载
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
Redmine
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>
编程算法 - 左旋转字符串 代码(C)
查看>>
IOS解析XML
查看>>
Python3多线程爬取meizitu的图片
查看>>
树状数组及其他特别简单的扩展
查看>>
zookeeper适用场景:分布式锁实现
查看>>