16

关于编程,“过载”/“过载”是什么意思?

4

8 回答 8

24

这意味着您提供了一个名称相同但签名不同的函数(方法或运算符)。例如:

void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
于 2008-11-14T13:00:59.403 回答
15

基本概念

重载或“方法重载”是具有多个具有相同名称但具有不同参数的方法的概念的名称。

例如,c# 中的 System.DateTime 类有多个 ToString 方法。标准 ToString 使用系统的默认区域性将日期时间转换为字符串:

new DateTime(2008, 11, 14).ToString(); // returns "14/11/2008" in America

而同一方法的另一个重载允许用户自定义格式:

new DateTime(2008, 11, 14).ToString("dd MMM yyyy"); // returns "11 Nov 2008"

有时参数名称可能相同,但参数类型可能不同:

Convert.ToInt32(123m);

将小数转换为 int 而

Convert.ToInt32("123");

将字符串转换为 int。

过载分辨率

为了找到要调用的最佳重载,编译器执行名为“重载解析”的操作。对于第一个示例,编译器只需匹配参数计数即可找到最佳方法。对于第二个示例,如果传递十进制参数,编译器会自动调用十进制版本的替换方法,如果传递字符串参数,编译器会自动调用字符串版本。从可能的输出列表中,如果编译器找不到合适的调用,您将收到类似“最佳重载与参数不匹配...”的编译器错误。

您可以找到很多关于不同编译器如何执行重载解析的信息。

于 2008-11-14T13:11:47.870 回答
6

当一个函数有多个签名时,它就会被重载。这意味着您可以使用不同的参数类型调用它。例如,您可能有一个在屏幕上打印变量的函数,您可以为不同的参数类型定义它:

void print(int i);
void print(char i);
void print(UserDefinedType t);

在这种情况下,函数 print() 将具有三个重载。

于 2008-11-14T13:01:45.627 回答
4

这意味着具有相同函数的不同版本,它们采用不同类型的参数。这样的功能是“重载”的。例如,采用以下函数:

void Print(std::string str) {
  std::cout << str << endl;
}

您可以使用此函数将字符串打印到屏幕上。但是,当您要打印整数时不能使用此函数,您可以制作该函数的第二个版本,如下所示:

void Print(int i) {
  std::cout << i << endl;
}

现在函数被重载了,调用哪个版本的函数取决于你给它的参数。

于 2008-11-14T13:02:04.770 回答
2

其他人已经回答了超载是什么。当您开始时,它会与覆盖/覆盖混淆。

与重载相反,覆盖是在子类(或子类)中定义具有相同签名的方法,它会覆盖父类的实现。某些语言需要显式指令,例如virtualC++ 或overrideDelphi 和 C# 中的成员函数。

using System;

public class DrawingObject
{
    public virtual void Draw()
    {
        Console.WriteLine("I'm just a generic drawing object.");
    }
}

public class Line : DrawingObject
{
    public override void Draw()
    {
        Console.WriteLine("I'm a Line.");
    }
}
于 2009-01-07T08:18:08.250 回答
1

重载方法是一种具有多个参数数量和类型选项的方法。例如:

foo(foo)

foo(foo, bar)

两者都会做相对相同的事情,但一个有更多选项的第二个参数

您也可以使用相同的方法采用不同的类型

int Convert(int i)
int Convert(double i)
int Convert(float i)
于 2008-11-14T13:02:22.287 回答
0

就像通常的用法一样,它指的是某事(在这种情况下,是方法名称),做不止一项工作。

于 2008-11-14T13:06:00.923 回答
0

重载是来自 CLOS 和其他语言的多方法的穷人版本 。这是令人困惑的一个。

覆盖是通常的 OO 之一。它与继承有关,我们也将其称为重新定义(例如,在https://stackoverflow.com/users/3827/eed3si9n 的答案 Line中提供了Draw().

于 2009-04-16T23:07:47.497 回答