读书笔记只记录了我从书中获取的新知识,已经掌握的部分会忽略不计了。
1. initializer_list形参:
使用情况:函数实参数量未知,但全部实参类型相同。
定义:一种标准库类型。用于表示某种特定类型的值的数组。
同vector,它也是一种模板类型。其中的元素为常量值,不可修改!!
也可以使用size(),begin(),end()函数。使用花括号传参。
2. 省略符形参:
使用范围:便于C++程序访问 使用了varargs的C标准库的代码。
只能用于形参列表的最后一个位置。
3. 函数的值如何返回:
在初始化调用点的位置有一个临时量,即函数调用的结果。
函数完成后,它所占用的存储空间也会随之被释放。所以要引用局部变量的引用或指针。
4. 返回数组指针:
int *p1[10]; // 含有10个指针的数组
int (*p2)[10]; // 一个指针,执行含有10个整数的数组
声明:
int (*func(int i))[10];
使用别名: typedef int arrT[10]; // 用arrT代表int [10]
func可表示为:arrT* func(int i);
5. 尾置返回值:
auto func(int i) -> int(*)[10];
6. 函数重载:
两个函数除返回值外,名称和形参全部相同,这样是不允许的。
顶层const形参和一个没有const的形参无法区分来看。
二义性调用:有多余一个的函数可以匹配,但是都不是最佳匹配,此时将发生错误。
在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。因为函数名字查找发生在类型查找前。
7.内联函数:
调用函数一般比执行相同的代码慢些。大多数机器上,调用一次函数要做的工作:调用前保存寄存器,并在返回时恢复。可能需要拷贝实参。程序转向一个新的位置继续执行。
内联函数可避免调用的开销:内联函数将它每个调用点,“内联地”展开。相当于调用的位置直接使用了函数中的代码。
适用于规模小,流程直接,调用频繁的函数。函数前加关键字 “inline”
constexpr函数:返回值和所有形参都为字面值,函数中有且只有一个return。编译器把这个函数隐式地指定为内联函数。
在形参赋为非字面值时,返回值也是非字面值。
内联和constexpr函数可以多次定义,但必须定义一致。通常定义在头文件里。
8.调试帮助:
assert预处理宏: 它的行为依赖于NDEBUG(一个预处理变量的状态)。如果定义了NDEBUG,则assert什么都不做。
_ _func_ _:const char类型,表示当前调试的函数名。
_ _FILE_ _:存放文件名字面值
_ _LINE_ _:当前行号字面值
_ _TIME_ _:文件编译时间字面值
9.函数指针:
函数指针指向函数,函数的类型由他的返回值和形参类型共同决定,与函数名无关。
bool (*pFunc)(int nA, int nB); // pFunc为函数指针
pFunc = FuncA; // 指向名为FuncA的函数
bool b1 = pFunc(3, 9); // 使用函数指针
函数指针可作为形参和返回值。