3、inline内联函数
1.>
内联函数它的具体做法和宏非常相似,也是在调用处直接将代码展开,只不过宏它是在预编译阶段展开,而内联函数是在编译阶段进行处理的。
2.>
内联函数和普通函数的区别:内联函数没有栈帧的开辟回退,一般我们直接把内联函数写在头文件中
递归一般不能声明为内联函数。
4.>
C++中inline内联编译的限制:
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取址操作
函数内联声明必须在调用语句之前
递归一般不能声明为内联函数。
5.>总结
优点:避免调用时的额外开销(入栈与出栈操作)
代价:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码
段的空间。
本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。
适用场景:函数体很“小”,且被“频繁”调用。
4、函数重载
1.>
C语言不存在函数重载,C++有函数重载。
2.>
重载规则
- 函数名相同。
- 参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。
- 返回值类型不同则不可以构成重载 。
void func(int a); //ok
void func(char a); //ok
void func(char a, int b); //ok
void func(int a, char b); //ok
char func(int a); //与第⼀个函数有冲突(第三条,返回值类型不同)
3.>
函数重载与函数默认参数
一个函数,不能既作重载,又作默认参数的函数。当你少写一个参数时,系统无法确认是重载还是默认参数。
#include <iostream>
using namespace std;
int func(int a, int b, int c = 0)
{
return a * b * c;
}
int func(int a, int b)
{
return a + b;
}
int func(int a)
{
return a;
}
int main()
{
int c = 0;
c = func(1, 2); //会报错,存在⼆义性,调⽤失败,编译不能通过
printf("c = %d\n", c);
return 0;
}