第三章 函数
含有可变参数的函数
-
C++标准中提供了两种主要的方法
- 如果所有的实参类型相同,可以传递一个名为 initializer_list 的标准库类型;
- 如果实参的类型不同,我们可以编写可变参数的模板。
-
initializer_list
- initializer_list 是一种标准库类型,用于表示某种特定类型的值的数组,该类型定义在同名的头文件中。
-
initializer_list 提供的操作
-
initializer_list 的使用方法
- initializer_list 是一个类模板;
- 使用模板时,我们需要在模板名字后面跟一对尖括号,括号内给出类型参数:
- initializer_list<string> ls; // initializer_list 的元素类型是 string
- initializer_list<int> li; // initializer_list 的元素类型是 int
- initializer_list 其对象中的元素永远是常量值,我们无法改变 initializer_list 对象中元素的值;
- 含有 initializer_list 形参的函数也可以同时拥有其他形参。
-
initializer_list 使用举例
- 在编写代码输出程序产生的错误信息时,最好统一用一个函数实现该功能,使得对所
有错误的处理能够整齐划一。然而错误信息的种类不同,调用错误信息输出函数时传
递的参数也会各不相同。 - 使用 initializer_list 编写一个错误信息输出函数,使其可以作用于可变数量的形参。
- 在编写代码输出程序产生的错误信息时,最好统一用一个函数实现该功能,使得对所
内联函数
-
内联函数
- 声明时使用关键字 inline;
- 编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销;
- 内联函数体内不能有循环语句和 switch 语句;
- 内联函数的定义必须出现在内联函数第一次被调用之前;
- 对内联函数不能进行异常接口声明。
-
内联函数应用举例
#include "pch.h" #include<iostream> using namespace std; const double PI = 3.14159265358979; inline double calArea(double radius) { return PI * radius * radius; } int main() { double r = 3.0; double area = calArea(r); cout << area << endl; return 0; }
constexpr 函数
-
constexpr 函数语法规定
- constexpr 修饰的函数在其所有参数都是 constexpr(常量表达式) 时,一定返回 constexpr(常量表达式);
- 函数体中必须有且仅有一条 return 语句。
-
constexpr 函数举例
- constexpr int get_size() { return 20; }
- constexpr int foo = get_size(); //正确: foo 是一个常量表达式