缺省值是指在函数声明时为参数提供的默认值,如果调用函数时没有传递参数,那么编译器就会自动使用缺省值。如果传递了参数,那么缺省值就会被忽略。使用缺省值可以简化函数的调用,减少重载函数的数量,提高代码的可读性和灵活性。
缺省值的用法
在C++中,我们可以在函数声明时为参数提供缺省值,使用如下的语法:
返回类型 函数名 (参数类型 参数名 = 缺省值, ...);
例如,我们可以定义一个计算两个数的平方和的函数,如下:
int squareSum (int x = 0, int y = 0) {
return x * x + y * y;
}
这里,我们为x和y两个参数都提供了缺省值0,表示如果没有传递参数,就默认为0。这样,我们可以用不同的方式来调用这个函数,如下:
squareSum (); // 等价于 squareSum (0, 0),返回0
squareSum (3); // 等价于 squareSum (3, 0),返回9
squareSum (3, 4); // 返回25
注意,缺省值只能从右向左依次提供,不能跳跃或者从左向右提供,否则会导致编译错误。例如,下面的函数声明是错误的:
int squareSum (int x = 0, int y); // 错误,不能只为左边的参数提供缺省值
int squareSum (int x, int y = 0, int z); // 错误,不能跳跃地提供缺省值
缺省值的注意事项
在使用缺省值时,有一些注意事项需要遵守,否则可能会导致编译错误或者逻辑错误。下面列举了一些常见的注意事项:
- 缺省值只能在函数声明时提供,不能在函数定义时提供,除非函数是内联的。例如,下面的代码是错误的:
// 在头文件中声明函数
int squareSum (int x = 0, int y = 0);
// 在源文件中定义函数
int squareSum (int x = 0, int y = 0) { // 错误,不能重复提供缺省值
return x * x + y * y;
}
- 如果一个函数在不同的作用域中被重复声明,那么缺省值只能在第一次声明时提供,或者在所有声明中都一致地提供。例如,下面的代码是错误的:
int squareSum (int x = 0, int y = 0); // 第一次声明,提供了缺省值
int main () {
int squareSum (int x, int y = 1); // 第二次声明,提供了不一致的缺省值,错误
return 0;
}
- 如果一个函数在不同的翻译单元中被重复声明,那么缺省值必须在所有翻译单元中都一致地提供。例如,下面的代码是错误的:
// 在头文件中声明函数
int squareSum (int x = 0, int y = 0);
// 在源文件1中定义函数
int squareSum (int x, int y) { // 缺省值被忽略,错误
return x * x + y * y;
}
// 在源文件2中调用函数
#include "squareSum.h"
int main () {
squareSum (); // 缺省值不一致,错误
return 0;
}
- 如果一个函数是模板函数,那么缺省值可以在模板声明或者模板定义时提供,但是不能同时在两处提供。例如,下面的代码是错误的:
// 模板声明
template <typename T>
T squareSum (T x = 0, T y = 0);
// 模板定义
template <typename T>
T squareSum (T x = 0, T y = 0) { // 错误,不能重复提供缺省值
return x * x + y * y;
}
- 如果一个函数是虚函数,那么缺省值只能在基类中提供,不能在派生类中提供,除非派生类的函数是隐藏的,而不是覆盖的。例如,下面的代码是错误的:
// 基类
class Base {
public:
virtual int squareSum (int x = 0, int y = 0) {
return x * x + y * y;
}
};
// 派生类
class Derived: public Base {
public:
// 覆盖基类的虚函数
int squareSum (int x = 1, int y = 1) override { // 错误,不能提供不一致的缺省值
return x * x + y * y + 1;
}
};
- 如果一个函数是友元函数,那么缺省值只能在友元函数的定义中提供,不能在类的声明中提供。例如,下面的代码是错误的:
// 类声明
class A {
friend int squareSum (int x = 0, int y = 0); // 错误,不能在类中为友元函数提供缺省值
};
// 友元函数定义
int squareSum (int x, int y) {
return x * x + y * y;
}
总结
- 缺省值是指在函数声明时为参数提供的默认值,如果调用函数时没有传递参数,那么编译器就会自动使用缺省值。如果传递了参数,那么缺省值就会被忽略。
- 使用缺省值可以简化函数的调用,减少重载函数的数量,提高代码的可读性和灵活性。
- 在使用缺省值时,需要遵守一些规则,否则可能会导致编译错误或者逻辑错误。
- 缺省值只能从右向左依次提供,不能跳跃或者从左向右提供。
- 缺省值只能在函数声明时提供,不能在函数定义时提供,除非函数是内联的。
- 如果一个函数在不同的作用域或者翻译单元中被重复声明,那么缺省值必须在所有声明中都一致地提供,或者只在第一次声明时提供。
- 如果一个函数是模板函数,那么缺省值可以在模板声明或者模板定义时提供,但是不能同时在两处提供。
- 如果一个函数是虚函数,那么缺省值只能在基类中提供,不能在派生类中提供,除非派生类的函数是隐藏的,而不是覆盖的。
- 如果一个函数是友元函数,那么缺省值只能在友元函数的定义中提供,不能在类的声明中提供。