C++Primer学习笔记12.12

66 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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( ...);