1.数组引用形参,C++允许将变量定义成数组的引用,给予同样的道理,形参也可以是数组的引用,此时引用形参绑定到对应的实参上,也就是绑定到数组上
1 void print(int (&arr)[10]) 2 { 3 for (auto elem : arr) 4 cout << elem << endl; 5 }
包含有可变形参 的函数,C++11提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,可以编写一种特殊的函数,也就是所谓的可变参数模板。initializer_list是一种标准库类型,用于表示某种特定类型的数组,这种类型定义在同名的头文件中,和vector一样,它也是一种模板类型,定义对象时,必须说明列表中所含元素的类型,和vector不一样的是,initializer_li9st对戏那个中的元素永远是常量值,无法改变对象中元素的值。
1 void err_msg(initializer_list<string> il) 2 { 3 for (auto beg = il.begin(); beg != il.end(); ++beg) 4 cout << *beg << " "; 5 cout << endl; 6 }
如果想向initializer_list形参中传递一个值得序列,则必须把序列放在一对花括号内;
1 if (expected != actual) 2 error_msg({"functionX"", expected, actual}); 3 else 4 error_msg({"functionX", "okay"});
而另一种方法是省略符形参,她是为了便于C++程序访问某些特殊的C代码而设置的,这些代码使用了名为varargs的C标准库功能。通常,省略符形参不应用于其他目的。
2.函数可以返回花括号保卫的值得列表,类似于其他返回结果,此处的列表页用来对表示函数返回的临时两进行初始化,如果列表为空,临时两知性初始化;否则,返回的值有函数的返回类型确定,在下面例子中,返回一个vector队形,用他存放信息。
1 vector<string> process() 2 { if (expected.empty)) 3 return {}; 4 else if (expencted == actual) 5 return {"functionX", "OK"}; 6 else 7 return {"functionX", expected, actual}; 8 }
1 int arr[10]; 2 int *p1[10]; 3 int (*p2)[10] = &arr; //p2是一个指针, 它指向含有10个整数的数组
3.assert预处理宏,其实是一个预处理变量,他的行为类似于内联函数,assert宏使用一个表达式作为他的条件:assert(expr);。首先对expr求职,如果表达式为假,那么assert输出信息并中止程序的知性,如果为真,那么assert什么也不做。assert用于检查“不能发生”的条件
1 assert(word.size() > threshold);
。当不需要assert在运行中起作用时候,通过定义NDEBUG的预处理变量可以取消这个assert的作用,或者通过给编译器选项 /d 或者-d。其等价于在主文件中第一行写下#define NDEBUG