我们使用string对象表示窗口内容时,希望窗口的高,宽等都有一个默认值。但同时允许这些参数自由指定与默认不同的值,此时可以定义成如下形式:
typedef string :: size_type sz;
string screen (sz ht = 24, sz wid = 80, char backgrnd = ' ' );
引用时,如果想使用默认值,则直接将screen函数置空,改变哪个值将哪个参数赋值。
例: screen(); 等价于screen(24, 80, ' ');
screen(66); 等价于screen(66, 80, ' ');
但是因为函数调用时是按照位置解析,所以应该合理设置形参的顺序,尽量让不怎么使用默认值的形参在前面。
sz wd = 80;
char def = ' ';
sz ht();
string screen (sz = ht(), sz = wd, char = def);
若此时调用函数改变一些实参:
例:void f2()
{
def = ' * '; //改变了默认实参的值
sz wd = 100; //未改变默认实参值,因为此处相当于重新定义的,跟外层的wd没关系
string window = screen (); 调用screen(ht(), 80, ' * ');
}
内联函数,在编译中展开,在函数返回类型前加上 inline 既可。
constexpr函数
指能用于常量表达式的函数,函数返回类型及所有形参类型都必须是字面值类型,且函数体有且只有一个return语句
允许constexpr函数的返回值并非一个常量:
constexpr size_t scale (size_t cnt)
{
return new_sz() * cnt;
}
调用时:
int arr[scale(2)]; //正确,scale(2)是常量表达式
int i = 2;
int arr[scale(i)]; //错误,不是常量表达式
常量表达式是指值不会改变并在编译过程就能得到计算结果的表达式。
int i = 3; 中,虽然i本身是一个常量,但其值直到运行时才能获得,但改为 const int i = 3;就是常量表达式了。