开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情
6.2.4 数组形参
数组的两个特殊性质:1、不允许拷贝。2、使用数组时通常会将其转换成指针
警告: 以数组作为形参的函数也必须确保使用数组时不会越界
数组形参和const
当函数不需要对数组元素执行写操作的时候,数组形参应该时指向const的指针。只有当函数确实要改变元素值的时候,才把形参定义成指向非常量的指针
数组引用形参此时,引用形参绑定到对应的实参上,也就是绑定到数组上
//形参是数组的引用,维度是类型的一部分
void print(int (&arr)[10]) {
for (auto elem :arr)
cout << elem << endl;
}
&arr两端的括号必不可少
f(int &arr[10]) // err 将arr声明成了引用的数组 不存在引用的数组
f(int (&arr)[10]) // arr是具有10个整数的整型数组的引用
但是这一做法限制了print函数的可用性,我们只能将函数作用于大小为10的数组
6.2.6 含有可变形参的函数
如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,我们可以编写一种特殊的函数,也就是可变参数模板
//类似于vector,定义initializer_list对象时,必须说明列表中所含元素的类型
initializer_list<string> ls; //initializer_list的元素类型时string
void error_msg(initializer_list<string> il) {
for (auto beg = il.begin(); beg != il.end(); ++beg)
cout << *beg << " ";
cout << endl;
}
//expected和actual是string对象
if (expected != actual)
error_msg({"functionX", "expected", "actual"});
else
error_msg({"functionX", "expected"});
省略形参:应该仅仅应用于C和C++通用的类型。特别需要注意的是,大多数类类型的对象在传递给省略符形参时都无法正确拷贝
省略符形参只能出现在形参列表的最后一个位置
void foo(parm_list, ...); void foo( ...);