一、函数默认值
1.定义:
我们可以赋予函数参数默认值。所谓默认值就是在调用时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。默认值可以在声明或定义中 设置;也可在声明或定义时都设置,都设置时要求默认值是相同的。
2.函数默认值的特性
(1)默认参数在函数声明中提供,当又有声明又有定义时,定义中不允许默 认参数,如果函数中只有定义,则默认参数才可以出现在函数定义中。
例如:
void point(int=3,int=4); //声明中给出默认值
void point(intx,inty) //定义中不允许再给出默认值
{
cout <<x<<endl;
cout <<y<<endl;
}
(2)如果一个函数中有多个默认参数,默认参数传参的顺序是从右向左,匹配是从左向右;
例如:
void func(int a=1,int b,int c=3, int d=4); //error
void func(int a, int b=2,int c=3,int d=4); //true
对于第2个函数声明,其调用的方法规定为:
func(10,15,20,30); //true:调用时给出所有实参
func(); //error:参数a没有默认值
func(i2,12); //true:参数c和d默认
func(2,15,20); //error:只能从右到左顺序匹配默认
(3)默认值的限定:默认值可以是全局变量、全局常量、函数;
例如:
int a=1;
int fun(int);
int g(int x;fun(a)); //ok:允许默认值为函数
默认值不可以是局部变量,因为默认参数的函数调用实在编译期间确定的,局部变量的位置和值在编译期间是无法确定的。
例如:
void fun()
{
int i;
void g(int x=i); //error:处理g()函数声明时,i不可见
}
3.函数默认值的设计
(1)函数默认值自右向左一次性设计
(2)默认值不能重复赋值
二、inline修饰的函数 (内联函数)
1.特点:
(1)在函数调用点之间(在编译期间)展开,不生成符号;
(2)内联只是编译器的建议;
(3)在debug版本下不生效,只在release下生效
(4)针对递归,系统一定不会使用内联函数,因为无法确定递归的深度
2.优点:
没有函数开栈和清栈的开销;
3.缺点:
(1)目标代码太大
(2)编译时间太长
4.当函数执行的开销 < 函数开栈的开销(即函数体较小的),选择内联函数。
5.内联函数的区别
(1)与普通函数的区别:
a.内联函数是代码被插入到调用者代码处的函数
b.内联函数在编译时,对每次调用都生成一个副本,运行时,内联函数直接展开(类似宏)即可运行。
普通函数编译时,只生成一个副本,在运行时,需进行一些进栈出栈操作来调用函数,和初始化参数。
c.内联函数占用内存大,效率高,普通函数占用内存小,效率低
(2)与宏的区别:
内联函数编译期间处理,有类型和安全检查,且可调试;
宏在预编译期间处理,无类型和安全检查,不可调试;
(3)与static修饰的函数的区别:
内联函数不生成函数符号;
static修饰的函数是在编译期间生成符号,保证本文件可见;