1、函数的默认值:
1、函数的默认值一般写在函数的声明中(函数的定义也可以写,但一般可见的是函数的声明,所以给在声明中)
2、自右向左依次赋值
3、默认参数不可重定义(只能赋值一次),可以轮流定义(遵循2)
4、默认值的限制
1、不能使用局部变量
2、可以使用全局变量,函数返回值
#include<iostream>
using namespace std;
int gdata = 10;
int Func(int a ,int b,int c = gdata );//函数声明
//函数的定义点
int Func(int a,int b,int c)
{
return a + b + c;
}
int main()
{
cout<<Func(10,20);
gdata = 30;
cout<<Func(10,20);
Func(10,20,30);
return 0;
}
2、函数重载
1、C++函数符号的生成规则:符号和返回值类型、形参类型和形参个数有关
2、函数重载的三要素:
1、同作用域
2、同名
3、参数列表不同(参数列表相同返回值不同无法识别,系统一样不知道执行哪个函数)
3、注意事项
#include<iostream>
using namespace std;
/*int Max(int a,int b)
{
return a > b ? a : b;
}
double Max(double a,double b)
{
return a > b ? a : b;
}*/
int Max(int a,int b)
{
return a+b;
}//?Max@@YAHHH@Z
int Max(int a,int b,int c = 20)
{
return a+b+c;
}
double Max(double a,double b);//?Max@@YANNN@Z
int main()
{
Max(10,20);
return 0;
}
这里一切的前提都是不让编译器产生二义性,只要会产生二义性,就会报错。如上这种情况。
3、inline函数
内联函数
函数名前加inline关键字即为内联函数,在编译时就在本文件调用处展开,(所以会导致如果外部引用,则无效:在链接阶段不会生成函数符号)
缺点:
会导致代码膨胀(当多次调用时,相当于代码重用了多次,占用空间大)
内联函数的使用建议
函数堆栈的开销 > 函数执行的开销 建议写成inline函数。(函数调用是多次堆栈的开销,而程序过大会导致执行的开销大:本处我更愿意理解为程序的存储)
内联函数的设计位置
一般写在头文件下:因为内联函数的定义,导致多个文件调用同一函数用inline不可行,则可用头文件(写函数定义,因为头文件会在每个包含的文件中展开,相当于每个文件中写了一份)。
inline函数,static函数
内联函数的注意事项
1、inline给编译器的一个建议:内联在Debug版本下不生效,Release版本下生效,Debug版本下本就添加了大量的调试信息,如果再用inline文件会过于巨大。
2、递归,while,switch(因为递归有终止条件在停止,而终止条件只有执行在知道。编译器做的是展开,而不会执行,所以不知道递归次数是多少,无法做到)。
3、内联是基于实现的,不是基于声明(声明没有内容可以展开,用了内联也无效)。