C++之函数传参方式

一、函数指针传参

  1. 什么是函数指针?
    函数指针本质上是一个指针,他是一个可以指向函数的指针。通过使用函数指针。我们可以在运行时决定调用哪个函数。

函数指针的定义

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. 引用传参:如何选择?

  1. 选择标准 (摘自AI让生活更美好)
    根据需求选择:如果需要在运行时动态选择和执行函数,那么函数指针传参无疑是最佳选择。而在处理大对象或需要在函数中直接修改参数值时,引用传参更为合适。
    考虑性能与可读性:对于性能敏感的应用,引用传参由于避免了复制开销,通常更加高效。而函数指针传参由于灵活性较强,往往会增加代码的复杂性,需要仔细考虑其对代码维护性的影响。
  2. 具体应用场景
    函数指针传参的应用:
    1.1 回调函数:在GUI编程或异步操作中,常用函数指针实现回调机制。
    1.2 策略模式:可以通过函数指针实现不同的算法策略,灵活选择算法实现。
    引用传参的应用:
    1.3 对象操作:在操作大型对象时,引用传参避免了不必要的复制,提高了程序的性能。
    1.4 输入输出参数:当函数需要返回多个结果时,可以通过引用传参来实现多值返回。
    四、总结
    函数指针传参和引用传参各自有其适用的场景和特点。函数指针传参提供了高度的灵活性,适用于需要动态选择函数的场景,而引用传参则强调效率和安全性,更适合处理大型对象和直接修改参数的场合。在实际编程中,根据具体的需求和代码设计选择合适的传参方式,才能写出高效且易于维护的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡蓝色的经典

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值