码迷,mamicode.com
首页 > 编程语言 > 详细

特殊用途语言特性

时间:2017-12-17 20:46:56      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:constexpr   表达式   隐式   用途   out   const   方法   输出   内联函数   

默认实参:

某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。

需要特别注意的是:

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 预处理宏:

 

特殊用途语言特性

标签:constexpr   表达式   隐式   用途   out   const   方法   输出   内联函数   

原文地址:http://www.cnblogs.com/geloutingyu/p/8052965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!