默认参数
一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同。“默认参数”指在定义或声明函数时为形参指定默认值(default)。这样的函数在调用时,对于默认参数,可以给出实参值,也可以不给出实参值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按默认值进行调用。
#include<iostream> using namespace std; void delay(int loops=1000){ //延时函数,默认延时1000个时间单位 for (; loops>0; loops--); } int main(){ delay(100); cout<<"延时100个时间单位"<<endl; delay(); //等同于delay(1000) cout<<"延时1000个时间单位"<<endl; return 0; }
几点注意:
- 默认参数并不一定是常量表达式,可以是任意表达式,则函数每次被调用时该表达式被重新求值,但表达式必须有意义。例如: int fun1(a=rand()); //调用时若省略参数a,即fun1();可由随机数发生函数当场产生,编译时确定调什么函数。
- 默认参数还可以是全局常量、全局变量,甚至可以通过函数调用给出;但不能通过局部变量给出,因为局部变量的值在执行时才有意义。
- 默认参数还可以有多个,但所有默认参数必须放在参数表的右侧,即先定义所有的非默认参数,再定义默认参数。例如: int sum(int a,int b=100,int c=200);这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。
- 在同一个作用域中一个参数只能被指定一次默认值,不可以在声明和定义中同时指定默认值,即使默认值一样也不行。例如: int fun2 (int, int =10, int =20); //函数原型中给出缺省值,参数名也可省略 void fun1() {…} int fun2(int a, int b, int c) {…}//定义中不再给出缺省值
- 习惯上,默认参数在公共头文件包含的函数声明中指定,否则默认实参只能用于包含该函数定义的文件中的函数调用。
- 在不同作用域或嵌套作用域中可以重新声明默认参数,但不提倡。在嵌套作用域中声明一个名字去屏蔽在外层作用域的同一名字的声明,尤其容易出错。
内联函数
- 当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。
- 有些情况下,函数本身功能简单,代码很短,但使用频率却很高,程序频繁调用该函数所花费的时间却很多,从而使得程序执行效率降低。
- 为了提高效率,一个解决办法就是不使用函数,直接将函数的代码嵌入到程序中。但这个办法也有缺点,一是相同代码重复书写,二是程序可读性往往没有使用函数的好。
- 为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。
举例: 请看如下程序段,读入一行字符串,逐个判断是否为数字字符:
# include <iostream.h> inline IsNumber(char ch) { //因使用频度很高,说明为内联函数 return ch>=′0′&&ch<=′9′?1:0; } void main(){ char ch; while(ch=cin.get(ch)!= ′ ′){ if (IsNumber(ch)) cout<<″是数字字符 ″<<endl;//内联函数的调用不特殊 else cout<<″不是数字字符 ″<<endl; } }