默认实参:
一旦某个形参被赋予了默认值,他后面的所有形参都必须有默认值。
调用含有默认实参的函数时,可以使用任意个数的参数,默认实参负责填补函数缺少的尾部实参。
在给定的作用域中一个形参只能被赋予一次默认实参,不能修改一个已经存在的默认值。(即使默认值相同也不行)
用作默认实参的名字在函数声明所在的作用域内解析,而这些名字的求值过程发生在函数调用时
int wd =80; cahr def = ' '; string screen(sz = wd , char = def); void f() { def = '*'; int wd = 100; window = screen(); }
本例中,在函数体内,改变了def的值,默认实参的值更新;声明了一个局部变量隐藏了wd,默认实参不更新。
内联函数:(没搞懂)
将函数指定为内联函数,通常就是将他在每个调用点上“内联的”展开(什么是内联的展开?)
内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求(什么时候编译器选择忽略?)
一般来说,内联机制用于优化规模较小、流程直接、调用频繁的函数。很多编译器都不支持内联递归函数。
constexpr函数:(没搞懂)
constexpr函数是指能用于常量表达式的函数。
函数的返回类型及所有形参类型都得是字面值类型,而且函数体中必须有且只有一条return语句。
constexpr函数被隐式的指定为内联函数。
constexpr函数体内也可以包含其他语句,只要这些语句在运行时不执行任何操作(?)
constexpr函数不一定返回常量表达式。(?)
内联函数和constexpr函数可以多次定义,但是它的多个定义必须完全一致。(?)
函数指针:
要想声明一个可以指向该函数的指针,只要用指针替换函数名即可:
当我们把函数名作为一个值的时候,该函数自动转换成指针:bool (*p) (string ); //指针两端的括号必不可少
函数可以返回一个函数指针,但是此时,编译器并不会自动的将函数返回类型当成对应的指针。用函数名给指针赋值。
用函数名作为形参、实参
在指向不同函数类型的指针之间不存在转换规则,但是可以给指针赋一个nullptr或者字面值0.
要注意的一点是对一个函数使用decltype时,并不会获得对应的指针,而仅仅是函数的类型。