函数重载与缺省参数
缺省参数
C++ 允许在函数声明时为参数提供默认值。调用时如果没有传递该参数,就使用默认值。 这叫做缺省参数(也叫默认参数)。
基本用法
#include <iostream>
using namespace std;
void greet(string name = "World") {
cout << "Hello, " << name << "!" << endl;
}
int main() {
greet(); // 输出 Hello, World!
greet("Alice"); // 输出 Hello, Alice!
return 0;
}
- 缺省参数的位置规则
- 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。
- C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值
void f(int a=0, int b = 10, int c = 20); // 全缺省
void f(int a, int b = 10, int c = 20); // 正确
void f(int a = 10, int b, int c = 20); // 错误,b 没有默认值却放在了中间
- 调用时,实参从左向右依次匹配,不能跳过缺省参数。
f(5); // a=5, b=10, c=20
f(5, 6); // a=5, b=6, c=20
f(5, 6, 7);// a=5, b=6, c=7
- 如果函数的声明和定义分开,缺省参数必须写在声明中,定义中不能再写缺省值。
// 声明(放在头文件中或者其他位置)
void init(int size = 100);
// 定义(放在源文件中)
void init(int size) {
// 实现代码
}
函数重载
在 C 语言中,同一个作用域里不允许出现两个同名的函数。
但有时候,我们希望用同一个名字表达一组功能相似的操作,比如“加法”:
- 两个整数相加:
int add(int a, int b) - 两个浮点数相加:
double add(double a, double b)
在 C 语言里,我们只能起不同的名字,比如 add_int 和 add_double,既不优雅,也不方便记忆。
C++ 允许我们在同一作用域中定义多个同名函数,只要它们的参数列表不同(参数个数、参数类型或参数顺序不同)。这就叫做函数重载。
重载的规则
重载函数必须满足以下条件之一:
- 参数个数不同
void f() { /* ... */ }
void f(int a) { /* ... */ }
void f(int a, int b) { /* ... */ }
- 参数类型不同
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
- 参数顺序不同
void show(int a, char b) { /* ... */ }
void show(char b, int a) { /* ... */ }
Important
注意:返回值类型不能作为重载的条件。因为调用时无法根据返回值类型判断应该调用哪个函数。
double f(int a) { /* ... */ } int f(int a) { return 0; } // 返回值类型不同不能作为重载
Warning
如果两个函数参数个数相同,但一个使用了缺省参数,可能会造成二义性:
>void f() { /* ... */ } void f(int a= 0) { /* ... */ } f2(10); // 错误!编译器不知道调用 f() 还是 f(int) void f2(int a) { /* ... */ } void f2(int a, int b = 0) { /* ... */ } f2(10); // 错误!编译器不知道调用 f2(int) 还是 f2(int,0)因此,设计重载时要注意避免这种歧义。
示例:加法函数的重载
#include <iostream>
using namespace std;
int add(int a, int b) {
cout << "int add" << endl;
return a + b;
}
double add(double a, double b) {
cout << "double add" << endl;
return a + b;
}
int main() {
cout << add(3, 5) << endl; // 调用 int 版本add函数
cout << add(3.14, 2.71) << endl; // 调用 double 版本add函数
return 0;
}
