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)是更好的选择。