默认实参:
某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。
需要特别注意的是:
1. 一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
2. 只能省略尾部的实参。
3. 实参会从形参列表的第一个形参开始匹配,若它们的类型能相互转换也能匹配成功。
4. 局部变量不能作为默认实参。除此之外,只要表达式的类型能转换成形参所需要的类型,该表达式就能作为默认实参。
1 #include <iostream> 2 using namespace std; 3 4 int gel(int a = 1, int b = 1, int c = 1){ 5 return a + b + c; 6 } 7 8 int ting(int a = 1, char b = ‘a‘, string c = "fjslf"){ 9 return a; 10 } 11 12 int yy1 = 1, yy2 = 1; 13 14 int yu(int a = yy1, int b = yy2){//可以使用全局变量作默认实参 15 return a + b; 16 } 17 18 // int lou(int a = 1, int b, int c){//错误:一旦某个形参有默认值,则其后面的所有形参都必须有默认值 19 // ; 20 // } 21 22 int main(void){ 23 int cnt1 = gel(); 24 int cnt2 = gel(2); 25 int cnt3 = gel(2, 2); 26 int cnt4 = gel(2, 2, 2); 27 cout << cnt1 << " " << cnt2 << " " << cnt3 << " " << cnt4 << endl;//输出 3 4 5 6 28 29 int cc1 = ting(10, ‘a‘, "fskl"); 30 // int cc2 = ting(‘a‘, "lsjf");//错误:只能省略尾部实参 31 int cc3 = ting(2, ‘b‘); 32 int cc4 = ting(‘b‘);//注意‘b‘能转换成int类型,此时‘b‘是赋值给形参a的 33 cout << cc1 << " " << cc3 << " " << cc4 << endl;//输出10 2 98 34 return 0; 35 }
内联函数:
内联函数可以避免函数调用时的时间开销。将函数指定为内联函数,通常就是将它在调用点上“内联地”展开。相当于将该函数直接嵌入调用点。
定义一个比较两个 int 型的内联函数:
1 inline bool compre(const int a, const int b){ 2 return a > b; 3 }
内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。一般来说,内联机制用于优化规模比较小,流程直接,频繁调用的函数。很多编译器都不支持内联递归函数,而且一个 75 行的函数也不大可能在调用点内联地展开。
constexpr 函数:
constexpr 函数是指能用于常量表达式的函数。定义 constexpr 函数的方法与其他函数类型,不过要遵循几项约定:
1. 函数的返回类型以及所有的形参类型都得是字面值类型。
2. 函数体内必须有且只有一条 return 语句。
1 #include <iostream> 2 using namespace std; 3 4 constexpr int new_sz(int a){ 5 return a; 6 } 7 8 constexpr char new_char(char s){ 9 return s; 10 } 11 12 // constexpr string new_str(string s){//错误 13 // return s; 14 // } 15 16 int main(void){ 17 const int foo = new_sz(10); 18 cout << foo << endl; 19 20 const char ch = new_char(‘h‘); 21 cout << ch << endl; 22 return 0; 23 }
执行初始化任务时,编译器把 constexpr 函数的调用替换成其结果值。为了能在编译过程中随时展开,constexpr 函数被隐式的指定为内联函数。
constexpr 函数体内也可以包含其他语句,只要这些语句在运行时不执行任何操作就行。例如:constexpr 函数中可以有空语句,类型别名以及 using 声明:
1 constexpr int new_sz(int a){ 2 // int b;错误:在constexpr函数中不能有执行操作的语句 3 using ll = long long;//在constexpr函数中可以有using声明 4 ;//在constexpr函数中可以有空语句 5 typedef int in;//在constexpr函数中可以有命名类型别名 6 return a; 7 }
和其他函数不一样,内联函数和 constexpr 函数可以在程序中多次定义。毕竟,编译器要想展开函数仅有声明是不够的,还需要函数的定义。不过,对于某个给定的内联函数或者 constexpr 函数来说,它的多个定义必须完全一致。基于这个原因,内联函数和 constexpr 函数通常定义在头文件中。
调试帮助
assert 预处理宏: