函数重载 3个月前

编程语言
896
函数重载

本章前面提到过,在调用函数时,必须匹配函数的签名。这表明,需要有不同的函数操作不同类型的变量。函数重载允许创建多个同名函数,每个函数可使用不同的参数类型。例如,前面使用了下述代码,其中包含函数 MaxValue()

class Program
{
    static int MaxValue(int[] intArray)
    {
        int maxVal = intArray[0];
        for (int i = 1; i < intArray.Length; i++)
        {
            if (intArray[i] > maxVal)
                maxVal = intArray[i];
        }
        return maxVal;
    }

    static void Main(string[] args)
    {
        int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
        int maxVal = MaxValue(myArray);
        Console.WriteLine("The maximum value in myArray is {0}", maxVal);
        Console.ReadKey();
    }
}

这个函数只能用于处理 int 数组。可为不同的参数类型提供不同名称的函数,例如把上述函数重命名为 IntArrayMaxValue(),添加诸如 DoubleArrayMaxValue() 的函数处理其他类型。还有一种方法,即在代码中添加如下函数:

static double MaxValue(double[] doubleArray)
{
    double maxVal = doubleArray[0];
    for (int i = 1; i < doubleArray.Length; i++)
    {
        if (doubleArray[i] > maxVal)
            maxVal = doubleArray[i];
    }
    return maxVal;
}

这里的区别是使用了 double 值。函数名称 MaxValue() 是相同的,但其签名是不同的。这是因为如前所述,函数的签名包含函数的名称及其参数。用相同签名来定义两个函数是错误的,但因为这里的两个函数的签名不同,所以没有问题。

函数的返回类型不是其签名的一部分,所以不能定义两个仅返回类型不同的函数,它们实际上有相同的签名。

添加了前面的代码后,现在有两个版本的 MaxValue(),它们的参数是 intdouble 数组,分别返回 intdouble 类型的最大值。

这种代码的优点是不必显式地指定要使用哪个函数。只需提供一个数组参数,就可以根据使用的参数类型执行相应的函数。

此时,应注意VS中 IntelliSense 另一种功能。如果在应用程序中有上述两个函数,而且要在 Main() 中键入函数的名称,IDE就可以显示出可用的重载函数。如果键入下面的代码:

double result = MaxValue(

IDE就会提供两个 MaxValue() 版本的信息,可以使用上下箭头键在其间滚动。

在重载函数时,应包括函数签名的所有方面。例如,有两个不同函数,它们分别带有值参数和引用参数:

static void ShowDouble(ref int val)
{
    ...
}
static void ShowDouble(int val)
{
    ...
}

选择使用哪个版本纯粹是根据函数调用是否包含 ref 关键字来确定的。下面的代码将调用引用版本:

ShowDouble(ref val);

下面的代码调用值版本:

ShowDouble(val);

此外,还可以根据参数的个数等来区分函数。

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2222721
累计阅读

热门教程文档

Swift
54小节
C
14小节
爬虫
6小节
Python
76小节
Lua
21小节