编程语言入门/重载
外观
< 编程语言入门
一些编程语言支持重载。重载有两种类型:函数名重载和运算符重载。函数名重载是指在同一作用域内存在多个具有相同名称的成员函数。尽管具有相同的名称,但这些函数必须具有不同的签名,签名包括函数名称及其参数的类型和顺序。以下示例说明了函数名重载的使用。
#include <iostream>
int sum(int a, int b) {
std::cout << "Sum of ints\n";
return a + b;
}
double sum(double a, double b) {
std::cout << "Sum of doubles\n";
return a + b;
}
int main() {
std::cout << "The sum is " << sum(1, 2) << std::endl;
std::cout << "The sum is " << sum(1.2, 2.1) << std::endl;
}
在 main 函数的上下文中,需要选择合适的 sum 函数来调用。这种选择是通过将调用中的实际参数类型与某个声明中的形式参数类型进行匹配来完成的。这种选择合适的函数的过程称为重载解析。如果编译器无法将函数调用与函数声明匹配,则会抛出错误消息或异常。正如在强制转换部分将要讨论的那样,可以使用相同数量的实际参数但类型不完全相同的参数定义来调用函数。一些语言提供了某种转换,以试图找到匹配项。
通过更改函数名称使其唯一,可以消除函数名重载。之后,需要找到程序中的每个函数调用并将其替换为相应的函数名称。这种策略是某些语言系统实现重载的方式。它创建了独立的函数定义,并且每个引用根据涉及的类型进行替换。以下代码代表了对函数重载 sum 所做的修改。
#include <iostream>
int sum_i(int a, int b) {
std::cout << "Sum of ints\n";
return a + b;
}
double sum_d(double a, double b) {
std::cout << "Sum of doubles\n";
return a + b;
}
int main() {
std::cout << "The sum is " << sum_i(1, 2) << std::endl;
std::cout << "The sum is " << sum_d(1.2, 2.1) << std::endl;
}
许多语言都支持运算符重载。这个概念与同一个运算符根据其参数的不同而具有不同的实现有关。一些语言允许程序员改变运算符的含义。通过这样做,用户可以在问题域的语言中编程,而不是在机器的语言中编程。下面的示例说明了使用 + 运算符进行字符串连接以及使用 << 运算符打印 MyString 对象。执行此程序的结果是在屏幕上显示单词 "UFMG"。
#include <string.h>
#include <ostream>
#include <iostream>
class MyString {
friend std::ostream & operator<<(std::ostream & os, const MyString & a) {
os << a.member1;
}
public:
static const int CAP = 100;
MyString (const char* arg) {
strncpy(member1, arg, CAP);
}
void operator +(MyString val) {
strcat(member1, val.member1);
}
private:
char member1[CAP];
};
int main () {
MyString s1("UF");
MyString s2("MG");
s1 + s2;
std::cout << s1 << std::endl;
}