C++ 缺省参数与函数重载机制解析
缺省参数允许在函数声明或定义时为形参指定默认值。调用函数时若省略对应实参,编译器会自动采用预设值参与运算。
#include <iostream>
using namespace std;
void compute(int x = 5, int y = 15) {
cout << x * y << endl;
}
int main() {
compute(); // 输出 75,采用默认值 5 和 15
compute(3, 4); // 输出 12,实参覆盖默认值
return 0;
}
缺省参数分为两类:全缺省与半缺省。全缺省指所有形参均具备默认值,调用时可全部省略;半缺省则要求从右向左连续设置默认值,未指定默认值的形参必须在调用时显式传值。
#include <iostream>
using namespace std;
void calculate(int m, int n = 10, int p = 20) {
cout << m + n + p << endl;
}
int main() {
calculate(1); // 输出 31,m=1, n=10, p=20
calculate(1, 2); // 输出 23,m=1, n=2, p=20
calculate(1, 2, 3);// 输出 6,全部覆盖
return 0;
}
关键注意点:当函数的声明与定义分离时,默认值仅能出现在声明处,定义中不可重复指定。
#include <iostream>
using namespace std;
// 声明处指定默认值
void display(int val = 100);
int main() {
display(); // 输出 100
return 0;
}
// 定义处不可再写默认值
void display(int val) {
cout << val << endl;
}
函数重载的实现原理
C++ 允许同名函数共存,前提是参数列表存在差异(类型、数量或顺序不同),返回值类型不构成重载依据。
#include <iostream>
using namespace std;
int sum(int a, int b) {
return a + b;
}
double sum(double a, double b) {
return a + b;
}
double sum(double a, double b, double c) {
return a + b + c;
}
int main() {
cout << sum(2, 3) << endl; // 调用 int 版本
cout << sum(2.5, 3.5) << endl; // 调用双参数 double 版本
cout << sum(1.0, 2.0, 3.0) << endl; // 调用三参数版本
return 0;
}
编译器区分重载函数的核心机制在于名字修饰(Name Mangling)。源代码转化为可执行文件需经历预处理、编译、汇编、链接四个阶段。链接器定位函数地址时,C 语言仅依据函数名,而 C++ 会将参数信息编码进符号名。
以 Linux 系统为例,采用 g++ 编译后,函数 int sum(int, int) 的修饰名格式为 _Z3sumii(_Z 前缀 + 函数名字符数 + 函数名 + 参数类型简写),double sum(double, double) 则变为 _Z3sumdd。参数差异导致符号名不同,链接器得以准确区分各函数实体。
Windows 平台的 Visual C++ 采用类似策略但格式更为复杂,通常以 ?sum@@YAHHH@Z 形式呈现,同样嵌入返回值与参数类型信息。这种编译期的符号变换是 C++ 支持函数重载的底层基础,也是 C 语言无法直接兼容该特性的根本原因。