一、函数指针传参
- 什么是函数指针?
函数指针本质上是一个指针,他是一个可以指向函数的指针。通过使用函数指针。我们可以在运行时决定调用哪个函数。
函数指针的定义:
int (*fun)(int,int);
初始化函数指针
#include<stdio.h>
#include<iostream>
using namespace std;
int add(int a, int b)
{
int result = a + b;
return result;
}
int main()
{
int (*fun)(int, int);
fun = add; //初始化函数指针
int res = fun(3, 4); //使用函数指针去调用函数
cout << res << endl;
return 0;
}
函数指针做为函数参数进行传递的时候(回调函数)
#include<stdio.h>
#include<iostream>
using namespace std;
int Add(int a, int b)
{
int result = a + b;
return result;
}
int Mul(int a, int b)
{
int res = a * b;
return res;
}
int Res(int(*fun)(int, int), int a, int b)
{
return fun(a, b); //将上面两个函数作为参数传入此函数
}
int main()
{
int res1 = Res(Add, 3, 4);
cout << res1 << endl;
int res2 = Res(Mul, 3, 4);
cout << res2 << endl;
}
函数指针作为参数传递给其他函数的时候,提高了调用函数的灵活性。
1.灵活性高:可以在运行时选择函数,实现更通用的代码设计
2.可拓展性高:适用于回调机制和策略模式
3.复杂度高:函数指针的使用容易增加代码的复杂性,尤其在涉及多个函数指针时,代码可读性降低
4.安全性:若未正确使用函数指针,可能导致未定义的行为,导致程序崩溃
函数指针作为函数的返回值
#include<stdio.h>
#include<iostream>
using namespace std;
int Add(int a, int b)
{
int result = a + b;
return result;
}
int Mul(int a, int b)
{
int res = a * b;
return res;
}
int (*fun(int opt))(int, int)
{
if (opt == 1)
{
return Add; //返回Add的函数地址
}
return Mul; //返回Mul的函数地址
}
int main()
{
int opt = 1;
int (*p)(int, int) = fun(opt); //将返回的函数地址赋值给函数指针
int res = p(3, 4); //使用函数指针调用函数
cout << res << endl;
}
返回值为函数指针的函数
1.(*fun(int opt))是一个函数,函数名fun,返回值是一个指针,参数是opt
2.去掉函数名字部分,剩下 int(*)(int,int),就是一个函数指针,该指针指向的函数有两个int类型的参数
二、引用传参
引用传参:&是C++里面独有的传参方式
int fun(int &a,int &b)
{
int res=a+b;
return res;
}
引用传参:
1.无需复制,引用传参避免了参数值的复制,从而提高了程序效率
2.允许修改,函数内部的操作会直接影响外部变量,这对于需要在函数中修改参数值的情况非常有用
3.高效,减少了内存的占用和赋值,适合传递大型对象
4.引用本质上是变量的别名,使用引用传递参数可能会避免指针传参导致空指针的错误,更加安全
5.因为函数内部对引用参数的修改会直接反映在外部变量上,如果不小心可能会导致意外的副作用。
6.引用传参只能用于非临时对象,因此对于需要传递函数作为参数的场景并不适用。
三、函数指针传参 vs. 引用传参:如何选择?
- 选择标准 (摘自AI让生活更美好)
根据需求选择:如果需要在运行时动态选择和执行函数,那么函数指针传参无疑是最佳选择。而在处理大对象或需要在函数中直接修改参数值时,引用传参更为合适。
考虑性能与可读性:对于性能敏感的应用,引用传参由于避免了复制开销,通常更加高效。而函数指针传参由于灵活性较强,往往会增加代码的复杂性,需要仔细考虑其对代码维护性的影响。 - 具体应用场景
函数指针传参的应用:
1.1 回调函数:在GUI编程或异步操作中,常用函数指针实现回调机制。
1.2 策略模式:可以通过函数指针实现不同的算法策略,灵活选择算法实现。
引用传参的应用:
1.3 对象操作:在操作大型对象时,引用传参避免了不必要的复制,提高了程序的性能。
1.4 输入输出参数:当函数需要返回多个结果时,可以通过引用传参来实现多值返回。
四、总结
函数指针传参和引用传参各自有其适用的场景和特点。函数指针传参提供了高度的灵活性,适用于需要动态选择函数的场景,而引用传参则强调效率和安全性,更适合处理大型对象和直接修改参数的场合。在实际编程中,根据具体的需求和代码设计选择合适的传参方式,才能写出高效且易于维护的代码。