1.带默认值的函数
C++中,允许在定义或声明函数时,为函数的某个参数指定默认值。当调用函数时,没有为它指定实际参数时,系统自动将默认值赋给形式参数。
例如可以声明函数成:
void print(int value, int base=10); //如果后边调用print(20),相当于调用print(20,10)
需要注意几点:
- 缺省的函数无论有几个,都必须放在参数序列的最后,编译器一次把实际参数传给形参。没有得到实际参数的形参取它的默认值。但至少应该给出一个实际参数。如
Int SaveName (char *first, char second = “”,char *third = “”, char *fouth = “”);
2.最好在函数声明处指定默认值,只有在函数声明处指定才有意义。因为参数的默认值是提供给函数调用者使用,编译器是根据函数原型声明确定函数调用是否合法的,所以在函数定义处指定默认值是没有意义的,除非该函数定义还充当了函数声明的作用。
3.不同的源文件中,可以对函数的参数指定不同的默认值。但在同一个源文件中对每个函数的每一个参数只能指定一个默认值。
2.内联函数
目的是提高执行效率,内联函数以代码复制为代价,省去了函数调用的开销,提高函数的执行效率。函数调用需要系统做一些额外的工作,如分配内存和回收内存,会影响执行时的性能。如果函数比较大,运行时间比较长,相比之下,调用时的额外开销可以忽略。但如果函数本身比较小,运行时间也很短,则调用时的额外开销就显得很客观了,使用函数就似乎得不偿失。
编译时,编译器将内联函数的代码复制到调用处来避免函数调用。内联函数的代价是会产生函数代码的多个副本,并分别插入到每一个调用该函数的位置上,从而使生成的目标代码变长。“将对此函数的每一个调用行动”都以函数代码取代之。
【effective c+++ M33】请记住:inline指令就像register指令一样,只是对编译器的一种提示,而不是一个强制命令,意思是编译器可自由决定要不要忽略你的inline指令。也就是说一个表面上的inline函数,实际上是否真是inline,必须视编译器而定。
在函数头部的返回类型前加一个关键字inline,就可以定义成内联函数。
#include<iostream>
inline float cube(float s)
{ return s*s*s; }
int main()
{ float side;
cin >> side;
cout << cube(side) << endls;
return 0;
}
以下情况不易用内联:
- 如果函数体内的代码比较长,使用内联函数将导致内存消耗代价比较高。
- 如果函数体内出现循环,那么执行函数内代码的时间要比函数调用的开销大。