在C++中,我们经常需要定义函数并给它们传递一些参数。有时候,某些参数的值是不经常改变或者只有特殊情况下才需要指定,这时候我们可以用缺省参数来简化代码。
什么是缺省参数?
缺省参数是
声明或定义函数时
为函数的
参数指定一个缺省值
。在调用该函数时,如果没有指定实参则采用该 形参的缺省值,否则使用指定的实参。
缺省参数语法
缺省参数语法如下所示:
void func(int a, int b = 0, int c = 0);
这里,func
函数有三个参数,其中b
和c
都被设置了默认值。如果在调用func
时只传入一个参数,那么b
和c
的值将分别是0。
缺省参数的使用
下面的代码演示了如何使用缺省参数:
#include <iostream>
using namespace std;
void func(int a, int b = 0, int c = 0) {
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
}
int main() {
func(10); // 输出:a = 10, b = 0, c = 0
func(10, 20); // 输出:a = 10, b = 20, c = 0
func(10, 20, 30); // 输出:a = 10, b = 20, c = 30
return 0;
}
在上述示例中,func
函数有三个参数,其中b
和c
都被设置了默认值。当我们在调用func
时只传入一个参数(即a
),那么b
和c
的值将分别是0,否则会使用传入的实参来覆盖缺省参数的默认值。
缺省值可以是哪些?
尽量使其是全局变量或常量。
实际上,在 C++ 中定义默认参数时,确实可以使用常量表达式和全局变量表达式,但也可以使用其他编译期可知的表达式,例如静态成员变量、枚举值等。所以缺省值并不一定必须是常量或全局变量。
下面是一些例子:
// 使用静态成员变量作为默认参数
class MyClass {
public:
static int default_value;
void foo(int x = default_value);
};
int MyClass::default_value = 42;
void MyClass::foo(int x) {
// ...
}
// 使用枚举值作为默认参数
enum my_enum { A, B, C };
void bar(my_enum e = A) {
// ...
}
在上述示例中,我们使用了静态成员变量和枚举值作为函数参数的默认值。尽管它们不是常量或全局变量,但它们都是编译期可知的常量表达式,因此可以用作默认参数。
需要注意的是,这里的“编译期可知”是指计算表达式的值所需的所有信息都可以在编译期解决,这样就可以在编译期确定默认参数的值。任何不能在编译期解决的表达式都不能用作默认参数,因为它们的计算可能需要在运行时进行,并且无法在编译器对函数签名进行分析时获得。