C++ primer 6.2.6 含有可变形参的函数

C++有一种特殊的形参类型(即省略符),可以用它传递可变数量的形参,这种功能一般用于与C函数交互的接口程序。
initializer_list 形参
如果实参数量未知,但全部实参类型相同,就可以使用initializer_list类型的形参(使用时需包含同名头文件)

定义initializer_list对象时,必须说明列表中所含元素的类型

例如
	initializer_list<string>lst;//initializer_list的元素是string类型
	initializer_list<int>lst;

initializer_list的元素都是常量值,无法改变

#include<string>
#include <iostream>
#include<initializer_list>

using namespace std;
void error_msg(initializer_list<string>il)
{
	for (auto beg = il.begin(); beg != il.end(); ++beg) {
		cout << *beg << " ";	
	}
	cout << endl;
	
}

int main()
{
	string expected = "Hello", actual;
	cin >> actual;
	if (expected != actual) 
	{
		error_msg({ "functionX",expected,actual });//传入实参用{a,b,c}这种形式
	}
	else
	{
		error_msg({ "functionX","okay" });
	}

	system("pause");
	return 0;
}

省略符形参

void foo(parm_list, ...);
//第一种形式为特定数目的形参提供了声明。在这种情况下,当函数被调用时,对于与显示声明的形参相对应的实参进行类型检查,而对于与省略符对应的实参则暂停类型检查。在第一钟形式中,形参声明后面的逗号是可选的。
void foo(...);//第二种无需类型检查

练习6.27

#include <iostream>
#include<initializer_list>
using namespace std;
int sum(initializer_list<int>il) {
	int x = 0;
	for (auto beg = il.begin(); beg != il.end(); ++beg) {
		x += *beg;
	}
	return x;
}
int main()
{
	int a = sum({ 1,2,3,4,5 });
	cout << a << endl;//结果15
	system("pause");
	return 0;
}

练习6.28
for循环中的elem类型是const std::string&
练习6.29
取决于initializer_list元素的类型。当类型是内置类型时,引用是不必要的。因为内置类型复制起来很容易(比如int)。否则,使用引用(const)是更好的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值