函数重载和函数指针

#include <iostream>
using namespace std;

//定义函数指针
//在给函数指针赋值时会发生函数重载匹配
//调用函数指针的时候,所调用的函数已经固定了,不存在隐式转换区别于常规的函数重载

int func(int a,int b){
	cout<<"a: "<<a<<"  b: "<<b<<endl;
	return 0;
}

int func(int a,int b,int c){
	cout<<"a: "<<a<<"  b: "<<b<<"  c:"<<c<<endl;
	return 0;
}

//1.定义一种函数类型

typedef int(my_func)(int,int);

//2.定义一个指向这种函数类型的函数指针

typedef int(*my_func_p)(int,int);
int main(){
	//1.调用方式
	my_func* fp = NULL;
	fp = func;
	fp(10,20);
	//或者(*fp)(20,30);
	//2.调用方式
	my_func_p fp1 = NULL;
	fp1=func;
	fp1(20,30);
	//3.调用方式(常用方式)
	int(*fp2)(int,int)=NULL;
	fp2 = func;
	fp2(30,40);
	int(*fp3)(int,int,int)=NULL;//重载函数一定匹配 参数列表
	fp3=func;
	fp3(10,30,50);
	system("pause");
	return 0;
}
### C/C++ 中函数指针函数指针数组 #### 定义声明 在C/C++中,函数指针是一种特殊的指针变量,它存储的是函数的入口地址。通过这种方式可以间接调用函数。 对于返回`int`类型的无参函数,其对应的函数指针定义如下[^1]: ```c // 声明一个指向返回 int 类型且没有任何参数的函数的指针 int (*funcPtr)(); ``` 当涉及到带有参数的函数时,则需指定这些参数的数据类型: ```c // 声明一个指向接受两个整数作为输入并返回整数值的函数的指针 int (*addFunc)(int, int); ``` 而所谓“函数指针数组”,即是指向多个相同签名(相同的返回值类型以及形参列表)函数的一组连续内存位置中的每一个都保存着不同实际函数的位置信息。因此,在创建这样的结构之前要先确定好目标函数原型: ```c // 创建一个含有三个元素的函数指针数组,每个元素都可以指向接收两个浮点数并返回单精度浮点结果的函数 float (*fpArray[3])(double, double); ``` #### 使用方法 一旦有了上述形式之一的对象之后就可以像下面这样操作它们: - **赋值**: 将具体实现体赋予相应的函数名来初始化该对象; ```c++ void greet() { printf("Hello world!\n"); } // 初始化 funcPtr 指向 greet 函数 void (*funcPtr)() = &greet; // 或者省略&符号写成void(*funcPtr)=greet; ``` - **调用**: 利用已知的目标执行相应逻辑 ```c++ // 调用由 funcPtr 所指示的方法 funcPtr(); ``` 同样的原则适用于处理整个集合的情况——只需遍历容器内的每一项即可完成批量作业;比如这里有一个简单的例子展示了如何利用循环机制依次触发一组预设动作: ```cpp #include <iostream> using namespace std; // 定义几个简单运算符重载版本 int add(int a, int b){return a+b;} int substract(int a,int b){return a-b;} typedef int (*BinaryOp)(int , int ); const BinaryOp ops[]={ add, substract }; int main(){ for(BinaryOp op : ops){ cout<<op(7,-2)<<endl;// 输出9 9 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值