6.4.7 默认参数调用
默认参数调用的基本思想是在声明语句中预先初始化一些参数的值,在调用语句中相应的参数可以默认,请看代码6.10的示例。
代码6.10 默认参数调用DefaultParameters
<—————————————文件名:example610.cpp——————————————> 01 #include<iostream> 02 #include<iomanip> 03 #include<string> 04 using namespace std; 05 int main() 06 { 07 void ShowString(char*,int n=2,int m=5);//原型声明时指定默认值 08 ShowString("I Love C++");//默认两个参数调用 09 cout<<"————————————"<<endl; 10 ShowString("Hello",1);//默认最后一个参数 11 cout<<"————————————"<<endl; 12 ShowString("World",3,2);//全部参数都设置 13 return 0; 14 } 15 void ShowString(char*ptext,int n,int m) 16 {//函数定义,输出n遍字符串,每遍缩进m个字符 17 int len=strlen(ptext); 18 for(int i=0;i<n;i++) 19 { 20 cout<<setw(len)<<ptext<<endl; 21 len=len+m; 22 } 23 }
输出结果如下所示。
I Love C++ I Love C++ ———————————— Hello ———————————— World World World
【代码解析】定义了ShowString()函数用于字符串的输出,该函数有3个参数,分别是字符串ptext(采用指针传递),输出次数n(int型,值传递),每行缩进字数m(int型,值传递),ShowString()函数用于将字符串ptext输出n遍,每遍首字母依次缩进m个空格。
代码第7行ShowString()函数声明采用了默认参数调用方式:“void ShowString(char*,int n=2,int m=5);”,这意味着在函数调用时,可以仅指定第一个参数,后两个参数可以省略,此时,默认将字符串输出两遍,每行首字母缩进5个字符。当然在程序中,也可以指定参数m和n的值,此时参数的默认值不再起作用。
关于默认参数调用要遵守下面4条规则。
(1)参数默认必须按从后向前的顺序,下列函数声明是不合法的。
void ShowString(char*,int n=2,int);
换句话说,在函数声明时,如果对第n个参数进行初始化,那么其后面所有的参数都应被进行初始化。所以在函数定义时,应合理安排形参列表顺序。
(2)和函数声明一样,在函数调用时省略某个参数,必须省略其后所有后续参数,在代码6.10中,这样的函数调用是不合法的。
ShowString("World",2);
(3)除非必要,否则请不要在函数内(尤其是函数的第一行)对参数进行初始化,否则,函数调用时实参向形参的传递就没有了意义。
(4)在函数调用时,也可对实参变量初始化,但此时不涉及默认参数调用的问题。实际上,每个实参都可以看做一个表达式,首先计算参数表达式的值,并将此值传递给形参,下式中的“int i=3;”的值是3,等价于“ShowString("World",3,2);”。
ShowString("World",int i=3,2);