对于带参数列表的函数,必须从右向左添加默认值,也就是说,要为某个参数设置默认值,则必须为它右边
的所有参数提供默认值:
int harpo(int n,int m = 4, int j = 5);/// valid
int chico(int n,int m = 6, int j;) ///invalid
int groucho(int k=1,int m=2, int n = 3)///invalid
例如harpo()原型允许调用该函数时提供1个,2个或3个参数:
beeps = harpo(2);///same as harpo(2, 4, 5)
beeps = harpo(1, 8);///same as harpo(1, 8, 5)
beeps = harpo(8, 7, 6);///no default arguments used
实参按从左到右的顺序一次被付给相应的实参,而不能跳过任何参数。
因此
下面的调用不被允许:
beeps = harpo(3, , 8);
注意,只有原型指定了默认值,函数定义与没有默认参数时完全相同。
请看下面的程序:*/
/*
#include <iostream>
using namespace std;
const int ArSize = 80;
char * left (const char * str,int n = 1);
int main()
{
char sample[ArSize];
cout << "Enter a string: \n";
cin.get(sample,ArSize);
char *ps = left(sample, 4);
cout << ps << endl;
delete [] ps;
ps = left(sample);
cout << ps << endl;
delete [] ps;
return 0;
}
char * left(const char * str, int n)
{
if(n < 0)
n = 0;
char * p = new char[n+1];
int i;
for(i=0; i<n&&str[i]; i++)
p[i] = str[i];
while(i <= n)
p[i++] = '\0';
return p;
}
Enter a string:
forthcoming
fort
f
Process returned 0 (0x0) execution time : 8.408 s
Press any key to continue
*/
使用new创建一个新的字符串,以存储被选择的的字符。不合作的用户要求的字符数目可能为负。此情况下,
函数将字符计数设置为0,并返回一个空字符串。另外,不负责任的用户要求的字符数目可能多于字符串包
含的字符数,为预防这种情况,使用组合测试:i < n && str[i]
i<n 让循环复制了n 个字符后终止, 测试的第二部分————表达式str[i],是要复制的字符的编码。
遇到空值字符后,循环将结束。这样,while循环将使字符串以控制字符结束,并将余下的空间设为空值字符。
另一种设置新字符串长度的方法是,将n设置为传递的值和字符串长度中较小的一个。
int len = strlen(str);
n = (n<len)?n:len;
char * p = new char[n+1];
这将确保new分配的空间不会多于存储字符串所需的空间。第二种方法明显不如第一种方法快。
当m的值等于n或到达字符串结尾时,下面的循环都将终止。
int m = 0;
while(m <=n && str[m] != '\0')
m++;
char * p = new char[m+1];
/// use m instead of n in rest of code
的所有参数提供默认值:
int harpo(int n,int m = 4, int j = 5);/// valid
int chico(int n,int m = 6, int j;) ///invalid
int groucho(int k=1,int m=2, int n = 3)///invalid
例如harpo()原型允许调用该函数时提供1个,2个或3个参数:
beeps = harpo(2);///same as harpo(2, 4, 5)
beeps = harpo(1, 8);///same as harpo(1, 8, 5)
beeps = harpo(8, 7, 6);///no default arguments used
实参按从左到右的顺序一次被付给相应的实参,而不能跳过任何参数。
因此
下面的调用不被允许:
beeps = harpo(3, , 8);
注意,只有原型指定了默认值,函数定义与没有默认参数时完全相同。
请看下面的程序:*/
/*
#include <iostream>
using namespace std;
const int ArSize = 80;
char * left (const char * str,int n = 1);
int main()
{
char sample[ArSize];
cout << "Enter a string: \n";
cin.get(sample,ArSize);
char *ps = left(sample, 4);
cout << ps << endl;
delete [] ps;
ps = left(sample);
cout << ps << endl;
delete [] ps;
return 0;
}
char * left(const char * str, int n)
{
if(n < 0)
n = 0;
char * p = new char[n+1];
int i;
for(i=0; i<n&&str[i]; i++)
p[i] = str[i];
while(i <= n)
p[i++] = '\0';
return p;
}
Enter a string:
forthcoming
fort
f
Process returned 0 (0x0) execution time : 8.408 s
Press any key to continue
*/
使用new创建一个新的字符串,以存储被选择的的字符。不合作的用户要求的字符数目可能为负。此情况下,
函数将字符计数设置为0,并返回一个空字符串。另外,不负责任的用户要求的字符数目可能多于字符串包
含的字符数,为预防这种情况,使用组合测试:i < n && str[i]
i<n 让循环复制了n 个字符后终止, 测试的第二部分————表达式str[i],是要复制的字符的编码。
遇到空值字符后,循环将结束。这样,while循环将使字符串以控制字符结束,并将余下的空间设为空值字符。
另一种设置新字符串长度的方法是,将n设置为传递的值和字符串长度中较小的一个。
int len = strlen(str);
n = (n<len)?n:len;
char * p = new char[n+1];
这将确保new分配的空间不会多于存储字符串所需的空间。第二种方法明显不如第一种方法快。
当m的值等于n或到达字符串结尾时,下面的循环都将终止。
int m = 0;
while(m <=n && str[m] != '\0')
m++;
char * p = new char[m+1];
/// use m instead of n in rest of code