【c++】含有可变形参的函数


【c++】含有可变形参的函数


有时我们无法预知应该向函数传递几个实参,这时候就要用到可变形参:

c++11 提供了两种主要方法:


1.initializer_list形参:

例如如下函数的定义:

//整数求和
int Sum(initializer_list<int> _list)
{
	int rst = 0;
	for (auto var : _list)
	{
		rst += var;
	}
	return rst;
}

这是一个求 所有整数之和 的函数,整数的个数是不确定的,我们可以采用 initializer_list 形参,
initializer_list 是一个模板类,用法很像 vector


模板指明参数的类型,例如 initializer_list<int> 表示int参数,所以这种方法只能实现同一类型的可变参数
使用时只需要像vector一样循环取出即可。

来看一下调用此函数的方法:

cout << Sum({ 1,2,3,4 }) << endl;	//这有点像数组的初始化,需要用 “{ }” 括起来参数列表。


2.省略符形参

省略符形参函数定义如下:

//整数求和
int Sum(int x, ...)		//用...表示后续参数
{
	//定义一个参数列表
	va_list ap;
	int result = 0;
	int var;
	//请看正文介绍va_start()
	va_start(ap, x);
	//请看正文介绍va_arg()
	while (var = va_arg(ap, int))
	{
		result += var;
	}
	//销毁列表
	va_end(ap);
	return result + x;
}

省略符形参 可以接受不同的参数类型,但是使用起来相对复杂:

va_list 在头文件 <stdarg.h> 或 <cstdarg> 中,它是用来存储实参的。
va_arg(ap,int) 方法用来获取实参列表中的实参,“int”是实参的类型。它从首个实参依次获取,将获取到的结果作为返回值返回。
va_start(ap,x) 就是用来设置首个实参,表示取参数的时候从x的下一个参数开始。(不取x)
va_end(ap) 表示用完ap,即要释放内存。

在获取参数列表的时候,va_list并不能判断实参的总个数,所以需要设置结束参数。
在上例中,判断取得的参数是否为0,如果为0,表示参数结尾:while (var = va_arg(ap, int)) 。

所以在使用函数时,需要以0作为结束参数:


//省略符形参不需要用{},但是要以0做结尾:
cout << Sum(1, 2, 3, 4, 0) << endl;



initializer_list形参摘自《c++ Primer》一书中 6.2.6含有可变形参的函数 一节,内容有删改。
书中对于省略符形参介绍甚少,特此加以补充


Thanks!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清风起~

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值