1. 自动对象:只存在于块执行期间的对象
2. 局部静态对象static:在程序执行路径第一次经过对象定义语句时初始化,并且知道程序终止才被销毁,如果局部静态变量没有显示的初始值,初始化为0.
3. 如果函数无须改变引用形参的值,最好将其生命为常量引用。
4. 使用引用形参返回额外信息
5. 和其他初始化过程一样,当用实参初始化形参时会忽略掉顶层const
6. 可以使用非常量初始化一个顶层const对象,但是反过来不行
7. 尽量使用常量引用,防止以为可以改变变量
8. 不许允拷贝数组,在使用数组时(通常)会将其转换成指针,并且确保使用数组时不会越界
9. 关于指针形参的使用,空字符结束和使用标准库规范
10. P198含有可变形参的函数
11. 省略符形参应该仅仅用于C和C++通用的类型,特别应该注意的是,大多数类类型的对象在传递给省略符形参时都无法正确拷贝
12. 通常情况下,void函数如果想在它中间位置提前退出,可以使用return语句
13. 一个返回函数是void的函数也能使用return另一个返回void的函数
14. 在含有return语句的循环后面应该也有一条return语句,如果没有的话该程序就是错误的
15. 不要返回局部对象的引用或指针
16. 列表初始化返回值:例如返回vevtor<string>如果返回的是内置类型,则花括号包围的列表最多包含一个值,且该值所占的空间不应该大于目标类型空间,如果函数返回的是类类型,由类本身定义初始值如何使用
17. 允许main函数没有return语句直接结束,如果控制到达了main函数的结尾处而且没有return语句,编译器将隐式地插入一条返回0的return语句
18. Main函数的返回值可以看作是状态指示器,返回0表示执行成功,返回其他值表示执行失败,其中非0值的具体含义依机器而定
19. 使用尾置返回类型:例如:auto func(int i) -> int(*) [10]; 返回一个指针,该指针指向含有10个整数的数组
20. 使用decltype:并不负责把数组类型转换成对应的指针,所以decltype的结果是个数组,想要表示返回指针还必须在函数声明时加一个*符号
21. 函数重载:不允许两个函数除了返回类型外其他所有的要素都相同,内层将隐藏外层声明的同名函数
22. 因为const不能转换成其他类型,所以我们只能把const对象传递给从const形参
23. 形参默认值:被赋予了默认值的形参,后面所有形参都必须有默认值;在给定的作用域中一个形参只能被赋予一次默认值;可多次声明函数给不同形参赋予默认值
24. 内联函数(inline):一般用于优化规模小、流程直接、频繁调用的函数,无递归时,内联函数的请求才会被编译器接受
25. Constexpr函数:指能用于常量表达式的函数。但返回值可以是非常量;返回和形参类型都是字面值类型,函数只执行一句return;被隐式指定为内联函数;
26. 预处理宏assert:根据提供的表达式判断是否要输出错误信息并终止程序,可定义预处理变量NDEBUG禁用assert的效果,常用于检查“不能发生”的条件
27. 可在#ifndef NDEBUG和#endif之间编写自己的调试代码;有5个编译器预定义的名字变量__func__/__FILE__/__LINE__/__TIME__/__DATE__,用于输出调试信息
28. 函数匹配:先选择在调用点可用的同名候选函数,再找到参数数量相等且类型相同或可强制转换的可行函数,再寻找其中最佳匹配的函数
29. 最佳匹配:每个实参的匹配都不劣于其他可行函数,且至少有一个优于其他;若找不到最佳匹配则报二义性错误
30. 调用重载函数时应尽量避免强制类型转换,如果在实际应用中确实需要强制类型转换,则说明我们设计的形参集合不合理
31. 实参类型转化优先级:精确匹配>const转换>类型提升>算术类型或指针转换>类类型转换
32. 函数指针:声明指向一个函数的指针,只需要用指针替换函数名;将函数名当作值使用时会自动转换成指针
33. 重载函数的指针:指针类型必须与重载函数中的某一个精确匹配
34. 函数指针形参:函数声明中,若形参是函数类型,则它会自动转换成指向函数的指针