C++ Primer 读书笔记4
关键概念
- 分离式编译——P186
- 可变形参——P197
void fun(initializer_list<string> il)//initializer_list定义在同名的头文件中
{
//initializer_list当做容器处理
}
fun({"q","w","a"});
initializer_list对象的元素永远是常量值。
- 重载与作用域——P210
如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同作用域中无法重载函数名。
- 内联函数和constexpr函数——P210
内联函数是用空间换时间用于规模较小、流程直接、频繁调用的函数。
- 内联函数和constexpr函数——P210
string read();
void print(const string &);
void print(double);//重载print函数
void fooBar(int ival)
{
bool read=false;//新作用域:隐藏外层的read
string s=read();//错误:read是一个bool值,不是函数
void print(int);//新作用域:隐藏之前的print
print("Value:");//错误:print(const string &)被隐藏
print(3.14);//正确:调用print(int);print(double)被隐藏掉了
}
- 调试帮助——P215
- 函数指针——P221
注意点
函数中实参是形参的初始值,第一个实参对应第一个形参。但是编译器能以任意可行的顺序对实参求值(实参可以是函数或者表达式)
形参名是可以省略的,未命名的形参无法使用。
函数的返回类型不能是数组类型或者函数类型。
局部静态对象的生命周期贯穿函数调用及之后的时间(函数调用结束后不销毁,程序终止时被销毁)(静态把对象的生命周期提升了一个级别?)——P185
当使用数组作为形参,要防止数组使用的越界。
数组引用形参一定要加括号
void fun(int (&arr)[10]); //正确:arr是具有10个整数的整形数组的引用。
void fun(int &arr[10]); //错误:将arr声明成引用的数组。
函数不能反回局部对象的引用或指针。
返回引用的函数得到的是左值其他类型得到的是右值。
在给定作用域中一个形参只能被赋予一次默认实参。
调用重载函数时应该尽量避免强制类型转换。如果在实际应用中确实需要强制转换类型转换,则说明我们设计的形参集合不合理。
函数指针的类型必须与重载函数中的某一个精确匹配。
小技巧
通过使用引用避免拷贝(拷贝大的类类型对象或者容器对象是比较低效的),如果不需要改变形参的值,只需要将其声明为常量引用。
void fun(const int &i)
{
}
C++可以使用尾置返回类型
//func返回一个指针,该指针指向含有10个整数的数组
auto func(int i)->int(*)[10];
如果形参是某种类型的指针或引用,通过区分其指向的是常量对象还是非常量对象可以实现函数重载。——P208
函数不能定义函数类型的形参,但是可以定义指向函数的指针,同理可以定义返回指向函数的指针。
将auto和decltype用于函数指针类型
int func1(const int&);
int func2(const int&);
//根据形参的取值,getFun函数返回指向func1或者func2的指针。
decltype(func1) *getFun(const string&);