首页 > 代码库 > 《C++Primer》复习——with C++11 [2]

《C++Primer》复习——with C++11 [2]

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 else4    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

《C++Primer》复习——with C++11 [2]