1.内置函数
1.1概念
调用函数要花时间和空间,在主调函数执行到函数调用语句时,流程的控制转移到被调用函数的入口处(转移前要记下该指 令的地址和当时的有关信息,以便返回和恢复),传递参数并执行函数体。然后流程再回到主调函数继续往下执行。
为了提高效率,在调用函数时直接将该函数的代码嵌入到主调函数中,不需要再把流程转出去。又称内嵌函数或内联函数。
1.2定义
inline int max(int,int,int);
可只在函数声明时加上inline指定内置函数,定义函数时也可以指定,总之要在调用这个函数前,把inline的信息告诉编译 系统,编译系统会在处理函数调用时按内置函数处理。
inline声明只是程序设计者对编译系统提出的建议,而不是指令。编译系统会根据具体情况决定是否处理为内置函数。遇到 复杂的函数体会忽略inline声明。
1.3 使用
虽然内置函数节省了运行时间,但增加了目标程序的长度。故只将规模小而使用频繁的简单函数(如定时数据采集)声明为内置函数。因为函数规模很小的时,调用的时间甚至可能超过执行时间,定义为内置函,大大减少了程序运行时间。
内置函数中不能包含复杂的控制语句,如循环和switch。
2. 函数重载
C++允许同一函数名定义多个函数:
一般来说一个函数对应一种功能。如果函数有同一类的功能,而只是有些细节不同,那么可以用同一个函数名统一起来。
函数类型、函数体、参数个数、参数类型、参数顺序都可以不同。
参数列表的三个标准中必须有一个是不同的,因为系统是根据调用函数时括号里的信息选择与之相匹配的函数。
3. 函数模板
3.1 C++提供了函数模板(function template)。
函数重载实现了一个函数名多用,实现相同或类似的功能。但仍然要定义多个函数,若是函数体和参数个数都相同,只是参数类型不同,可以用模板函数。
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函 数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
3.2 定义函数模板
template<typename T> //模板声明,其中T为类型参数
template<class T>
T max(T a,T b,T c) {函数体}// 定义一个通用函数,用T作虚拟的类型名
函数调用时根据实参的类型来确定T。
用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数的参数个数相同而类型不同。
4. 有默认参数的函数
有时多次调用同一函数时用同样的实参,C++提供简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了。
4.1 定义
void f2(float a,int c,int b=0, char d=′a′ );
实参与形参是从左至右结合的,所以指定默认值的参数必须放在最右端。
如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值。
总之要在这个函数调用前,把默认值的信息告诉编译系统,不然编译系统会在处理函数调用时认为实参形参的个数不匹配。
4.2 调用
调用灵活:
f2(3.5, 5, 3, ′x′) //形参的值全部从实参得到
f2(3.5, 5, 3) //最后一个形参的值取默认值′a′
f2(3.5, 5) //最后两个形参的值取默认值,b=0, d=′a′
可以看到,在调用有默认参数的函数时,实参的个数可以与形参的个数不同,实参未给定的,从形参的默认值得到值。利用这一特性,可以使函数的使用更加灵活。
当定义同一类功能而只是参数个数不同的两个函数时,可以考虑函数重载,但用默认参数更方便。
一个函数不能既作为重载函数,又作为有默认参数的函数。因为当重载函数调用就是依据形参的不同。如果少写一个参数,系统无法判定是利用两个形参的重载函数 还是利用 三个参数其中一个为默认参数 的函数,出现二义性,系统无法执行。