缺省参数梦想是世界上最快乐的事儿 — — 苏格拉底
- 1、缺省参数
- 2、缺省参数的分类
- 2.1 全缺省参数
- 2.2 半缺省参数
- 总结
1、缺省参数
一般情况下,函数调用时的实参个数应该和形参个数相同,但为了方便地使用函数,C++也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不同
缺省参数是指在定义函数时为形参指定缺省值(默认值)
这样的函数在调用时,对于缺省参数,可以给出实参值,也可以不给出参数值。
- 如果给出参数值,将实参传递给形参进行调用
- 如果不给出实参,则按缺省值进行调用
缺省参数的函数调用:缺省参数并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参是任意表达式,则函数每次被调用时该表达式被重新求值。但是表达式必须有意义
举个简单的栗子:
#includeusing namespace std; void delay(int loops = 5) // 参数缺省值 { // 延时函数,默认延时5个时间单位 for(; loops > 0; loops--); } int main() { delay(3); // 指定实参,使用实参 cout << "延时3个时间单位!" << endl; delay(); // 没有指定实参,调用缺省值,等同于:delay(5) cout << "延时5个时间单位!" << endl; return 0; }
缺省参数可以有多个,但所有的缺省参数必须放在参数表的右侧,即先定义所有的非缺省参数,再定义缺省参数。这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。
举个简单的栗子:
#includeusing namespace std; void func(int a, int b = 23, int c = 800) { cout << "a = " << a << "b = " << b << "c = " << c << endl; } int main() { func(12); // ok 打印:a=12 b=23 c=800 func(10, 20); // ok 打印:a=10 b=20 c=800 func(10, 20, 30); // ok 打印:a=10 b=20 c=30 func(10, , 30); // error 注意,它没有办法实现b不传,只传a和b,也就是说编译器只能按照顺序自左向右传递 return 0; }
输出结果如下图所示:
顾名思义,全缺省参数就是所有的参数都带有缺省值
int Add(itn a = 10, int b = 20, int c = 30) {}
全缺省参数通常这样进行参数传递:
#includeusing namespace std; int Add(int a = 10, int b = 20, int c = 30) { return a + b + c; } int main() { cout << Add() << endl; // ok 打印:60 没有实参,使用缺省值 cout << Add(1) << endl; // ok 打印:51 将1传递赋值给a,b、c使用缺省参数 cout << Add(1, 2) << endl; // ok 打印:33 将1传递赋值给a,2传递赋值给b,c使用缺省参数 cout << Add(1, 2, 3) << endl; // ok 打印:6 a、b、c分别传递赋值1、2、3,不使用缺省参数 cout << Add(1, , 3) << endl; // error 编译器不会跳着传参 return 0; }
其输出结果如下:
顾名思义,函数只有部分参数有缺省值,且在函数定义时缺省值要从右向左依次给出
例如:
int func(int a, int b = 20, int c = 30) {} // 只有参数b、c具有缺省值
举个简单的栗子:
#includeusing namespace std; int Sum(int a, int b = 20, int c = 30) { return a + b + c; } int main() { Sum(); // 编译出错,因为a没有缺省值,在函数调用时必须进行传参 Sum(10); // ok 60 Sum(10, 20); // ok Sum(10, 20, 30); // ok return 0; }
其输出结果如下:
总结
- 所有带缺省的参数必须放在参数列表的右侧,即先定义所有的非缺省参数,再定义缺省参数
- 缺省参数在公共头文件包含的函数声明中指定,不要在函数的定义中指出(如果在函数的定义中指定缺省参数值,在公共头文件包含的函数声明中不能再次指定缺省参数值)
- 缺省实参不一定必须是常量表达式,可以使用任意表达式
- 当缺省实参是一个表达式时,在函数被调用时该表达式被求值
- C语言不支持
不妨点在个赞再走呗!



