【共读Primer】56.[6.5]特殊用途语言特性--默认实参、内联函数、constexpr函数 Page211

默认实参

有时一个函数的某些参数在绝大多数情况下都被赋予一个相同的值。

在这种情况下我们可以给参数一个固定的默认值。

使指定参数在默认情况下使用指定的默认值

如何声明默认值

typedef string::size_type sz;
string screen(sz ht = 24, sz wid = 80, char backgrnd = ' ');

在上面的书写中给screen的三个参数都给予了默认值。

默认值实在函数的声明中给参数的后面紧挨一个等号,然后给出值

默认值在函数定义时不需要写出来。

默认值出现后,其右侧的所有参数都必须有默认值

如何使用具有默认值的函数

在函数调用时直接省略掉我们需要使用默认值的参数,编译器将会使用默认参数来进行函数调用

string window;
window = screen(); // 等价于screen(24, 80, ' ')
window = screen(66); // 等价于screen(66, 80, ' ')
window = screen(66, 256); //  // 等价于screen(66, 256, ' ')

内联函数

我们有时会写一些小规模的函数,它一般具有以下好处:

1. 通过函数名表达意思,比阅读代码本身要益于理解

扫描二维码关注公众号,回复: 3107760 查看本文章

2. 可以确保多出的行为一致

3. 如果出现变化我们能够以最小的代价达成变化目的

4. 重复利用,省去重复编写的麻烦

但是,任何事情都是有利有弊的,小函数存在的缺陷是

函数的调用要比表达式的计算复杂,所以运行开销上函数调用要远大于表达式的计算

内联函数将可以为我们将这种函数调用的成本消去

内联的实际做法是在写入内联函数的位置将函数的表达式代码展开到调用的位置

// 使用inline关键字来讲一个函数声明为内联的
inline const string &shorterString(const string & s1, const string & s2)
{
    return s1.size() <= s2.siez ? s1 : s2;
}

cout << shorterString(s1, s2) << endl;
// 编译后将变成
cout << (s1.size() < s2.size() ? s1 : s2) << end;

这里需要注意的是,内联函数只适合规模小、流程直接、调用频繁的函数。

inline关键字编译器可以选择将它忽略,一般忽略会发生在函数体明显过大的条件下

constexpr函数

函数的声明预定义与其他的函数类似

但是需要遵循一个特殊的原则:函数的返回值类型以及所有参数的类型都得是字面值类型,而且只能有一条return语句。

constexpr int new_sz() {return 32;}
constexpr int foo = new_sz();

猜你喜欢

转载自www.cnblogs.com/ChattyKu/p/9617248.html