文章目录
前言:
一、函数重载
1、概念
void print(int i) {
cout << "Integer: " << i << endl;
}
void print(double d) {
cout << "Double: " << d << endl;
}
void print(const string& str) {
cout << "String: " << str << endl;
}
2、重载的规则
- 参数列表不同: 函数的参数名称可以相同,但参数的数据类型或数量必须有所不同。
- 返回类型不作为重载依据: 仅返回类型不同而其他完全相同的两个函数是不允许的,因为编译器无法仅通过返回类型来区分它们。
const
修饰符的影响: 如果两个函数仅在const
修饰符上有区别,这也是合法的重载。- 默认参数不影响重载: 如果两个函数的参数列表完全相同,只是某个参数有默认值,这也构成了重载。
3、实现原理
- 函数名修饰:
- 在C语言中,函数名在编译时不会被修饰,因此无法支持函数重载。而在C++中,编译器会对函数名进行修饰,以包含函数的参数类型等信息。这种修饰后的名称被称为“修饰名”。
- 修饰名的生成规则因编译器而异,但通常包括函数名、参数类型、参数数量等信息。这样,即使两个函数具有相同的函数名,只要它们的参数列表不同,编译器就可以为它们生成不同的修饰名,从而区分它们。
- 参数列表的唯一性:
- 函数重载的核心在于参数列表的唯一性。两个重载函数必须具有不同的参数列表,这可以通过改变参数的个数、类型或顺序来实现。
- 当函数被调用时,编译器会根据提供的参数类型和数量,在重载函数集中找到匹配的函数进行调用。这一过程称为函数重载解析。