一、内联函数
1、作用
不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,适用于功能简单,规模较小又使用频繁的函数。递归函数无法内联处理,内联函数不能有循环体,switch语句,不能进行异常接口声明。
主要体现在于inline关键字
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收
获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
2、内联函数和宏函数区别
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。内联函数与带参数的宏定义进行下比较,它们的代码效率是一样,但是内联欢函数要优于宏定义,因为内联函数遵循的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关联上内联扩展,将与一般函数一样进行调用,比较方便。
另外,宏定义在使用时只是简单的文本替换,并没有做严格的参数检查,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。
二、默认参数(为解决传参时数量不够的问题)
1 #include <iostream>
2
3 using namespace std;
4
5 void print(int x,int y,int z = 100) //默认参数(当没有参数传入,使用默认参数)
6 { //一旦使用了默认参数。后面的所有参数都得加上默认参数
7 cout << x << y << z << endl;
8 }
9
10 int main()
11 {
12 int a = 1,b = 2;
13
14 print(a,b);
15
16 return 0;
17 }
//默认参数(当没有参数传入,使用默认参数)
//一旦使用了默认参数。后面的所有参数都得加上默认参数
三、函数占位参数
作用:为了方便后期给函数增加参数
1 #include <iostream>
2
3 using namespace std;
4
5 void print(int x,int y,int = 0) //占位参数结合默认参数一起使用
6 {
7 cout << x << y << endl;
8 }
9
10 int main()
11 {
12 int a = 1,b = 2;
13 print(a,b); //传参没有变量接受
14
15 return 0;
16 }
四、函数重载
1、重载概念
两个函数名字一样,但是参数类型不一样,根据参数自动匹配
2、重载标准、
①参数类型不一样
②参数个数不一样
③参数的顺序不一样
④函数的返回值不能作为重载的标准
1 #include <iostream>
2
3 using namespace std;
4
5 void add(int x,int y) //两个函数名字一样,但是参数类型不一样,根据参数自动匹配
6 {
7 cout << x+y << endl;
8 }
9
10 void add(double x,double y) //重载标准1.参数类型不一样
11 {
12 cout << x + y << endl;
13 }
14
15 void add(int x,int y,int z) //2.参数个数不一样
16 {
17 cout << x + y + z << endl;
18 }
19
20 void add(int a,char ch) //重载标准3:参数的顺序不一样
21 {
22 cout << (char)(x + ch) << endl;
23 }
25 /*int add(char ch,int x) //4.函数的返回值不能作为重载的标准
26 {
27 }*/
28
29 int main()
30 {
31 int a = 1, b =2;
32
33 add(a,b);
34
35 double c = 1.11,d = 2.222;
36 add(c,d);
37
38 add(1,2,3);
39
40 add(1,'a');
41
42 add('a',1);
43 return 0;
44 }
函数和默认参数的歧义:
1 #include <iostream>
2
3 using namespace std;
4
5 void f(int x,int y)
6 {
7 }
8
9 void f(int x,int y,int z = 0) //歧义
10 {
11
12 }
13
14 int main()
15 {
16 f(1,2);
17
18 return 0;
19 }
3、注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。