函数指针的应用场景

函数指针的最重要的一个用法就是将函数指针作为参数,在不同场景调用不同的函数指针作为参数

举个例子,怎么将函数指针作为一个函数的参数

void Cout(int* n)	// 输出函数
{cout << *n << " ";
}void Abs(int* n)	// 取绝对值函数
{*n = *n > 0 ? *n : -*n;
}void Op(int* n)		// 取相反数
{*n = -*n;
}typedef void (*fun_ptr)(int*);	// 声明函数指针void For(int* arr, int size, fun_ptr p)		// 循环遍历数组,执行 p 函数指针指向的函数
{for (int i = 0; i < size; i++)p(&arr[i]);	//arr[i] 拿到的是值,需要取地址才拿到的是地址,也可以这样写: p(arr + i);
}int main()
{int arr[] = { 1,-2,3,-4,5,-6 };For(arr, 6, Cout);	// 打印数组cout << endl;// 这里传入的是一个函数名称,其实也是传入的是函数的入口地址// 也就是说可以这样来写 :fun_ptr p = Cout; For(arr, 6, p);fun_ptr p = Cout; //函数指针 p 指向 Cout 函数For(arr, 6, p);cout << endl;For(arr, 6, Op);	// 传入的是函数入口地址For(arr, 6, p);cout << endl;// 用函数指针来传参fun_ptr Op_ptr = Op;For(arr, 6, Op_ptr);	// 传入的是函数指针For(arr, 6, p);cout << endl;For(arr, 6, Abs);	// 传入的是函数入口地址For(arr, 6, p);cout << endl;// 用函数指针来传参For(arr, 6, Op);fun_ptr Abs_ptr = Abs;For(arr, 6, Abs_ptr);	// 传入的是函数指针	For(arr, 6, p);cout << endl;return 0;
}

看到了这个代码获取你还是感觉到一头雾水,那么你可以试着换一个方式来理解,现在有三个需求:遍历打印数组,取数组的相反数,取数组的绝对值,我们会写三个函数,每一个函数一个 for 循环,然后对于不同的需求写不同的操作,这样就会不断的将 for 循环不断的书写,三个函数还好,如果是三百个,三千个,就会很浪费代码量。

再看一个代码:在一个 函数中增加一个标志位,用这个标志位来决定 for 循环中的是什么操作,针对每一个操作有不同的实现方式

for_each(int* arr, int size, int flag) {for (int i = 0; i < size; i++) {if (flag == 1) {//打印数值}else if (flag == 2) {//取反数值}else if (flag == 3) {//取绝对值}else {//... ...}}
}

这个代码的问题就暴露的很明显:

  • 函数的名称无法确定,一个函数根据标志位的不同,有不同的操作,不能已其中的一种操作来命名
  • 耦合度太高(根据需求的改变,代码的改动程度很大)
  • 将每一个功能实现写在 for 循环中,使得没有办法但是的使用其中的一个功能

使用函数指针的写法,好处好在哪里:

  1. 我们可以给每一个函数起一个名字,并且 for 循环只需要写一次
  2. 如果功能量很庞大的时候,不需要额外的空间来记录标志位对应的操作是什么
  3. 每一个功能都是函数,在别的 .cpp 文件中也可以直接访问其方法
  4. 程序的耦合性低

理解的还不是很清楚,我们再看一个代码

//Calculate用于计算积分。
//一共三个参数。第一个为函数指针func,指向待积分函数。第二、三个参数为积分上下限  
double Calculate(double(*func)(double x), double a, double b)
{double dx = 0.0001;//细分的区间长度  double sum = 0;for (double xi = a + dx; xi <= b; xi += dx){double area = func(xi) * dx;sum += area;}return sum;
}double func_1(double x)
{return x;
}double func_2(double x)
{return x * x;
}double func_3(double x)
{return x * x * x;
}int main()
{cout << Calculate(func_1, 0, 1) << endl;cout << Calculate(func_2, 0, 1) << endl; cout << Calculate(func_3, 0, 1) << endl;return 0;
}

大部分时间我们都是这样来使用函数指针的


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部