重点:
1.三种函数相关的语言特性:默认实参,内联函数和constexpr函数。
2.默认实参:某些函数有一种形参,在函数的很多次调用中它们都被赋予一个相同的值。
3.一旦某个形参被赋予了默认值之后,它后面的所以形参都必须要默认值。
4.若想使用默认形参,只要在调用函数时省略该实参即可。
Tip:Window = screen ( , , ‘?’ );//错误:只能省略尾部的实参!
5.对于函数的声明来说,习惯将其放在头文件当中,在给定的作用域中一个形参只能赋予一次默认实参。
NOTE:通常,应该在函数声明中指定默认实参,并将该声明放在适当的头文件当中。
6.一次函数调用:调用前要保存寄存器,并在返回时恢复,可能需要拷贝实参,程序转向一个新的位置继续执行。
7.内联函数(inline):消除函数运行时的开销。
NOTE : 内联说明只是编译器提出的一个请求,编译器可以选择忽略这个请求。
8.内联机制用于优化规模较小,流程直接,频繁调用的函数。
9.Constexpr函数:是指能用于常量表达式的函数。
定义constexpr函数:函数的返回类型以及所有形参的类型都是字面值类型(算术类型:整型和浮点型,引用和指针,string不包含),
函数体中必须有且只有一条return语句。
10.为了能在编译过程中随时展开,constexpr函数被隐式地指定为内联函数。
11.constexpr函数不一定返回常量表达式。
12.对于某个给定的内联函数或者constexpr函数,它的多次定义必须完全一致,基于此,内联函数和constexpr函数通常定义在头文件当中。
13.当应用程序编写完成准备发布时,要先屏蔽掉调试代码,这种方法用到两项预处理功能:assert和NDEBUG。
14.Assert是一种预处理宏,其实就是个预处理变量,行为类型与内联函数:assert(expr); 当expr为0,assert输出信息终止程序,expr非0,assert什么都不做。
15.预处理名字有预处理器非编译器管理。
16.和预处理变量一样,宏名字在程序中唯一。
17.Assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么都不做,如果没有定义NDEBUG,此时assert将执行运行时检查。