函数重载是编程中常见的一个概念,它允许我们使用相同的函数名来创建多个函数,这些函数可以有不同的参数列表。在MQL4中,我们也可以使用函数重载,这使得我们的代码更加灵活和通用。
函数重载的基本概念
在日常编程中,我们经常会发现,尽管函数的目的相同,但是处理的数据类型可能不同,这时我们就可以使用函数重载。例如,我们可以有两个计算数组平均值的函数,一个处理双精度浮点数数组,一个处理整数数组,但它们的函数名都可以为AverageFromArray
。这两个函数的具体实现分别如下:
double AverageFromArray(const double & array[],int size) {...}
double AverageFromArray(const int & array[],int size) {...}
每个函数都包含一个通过Print()
函数输出消息的语句,这样我们可以知道调用的是哪个函数。MQL4编译器会根据参数类型和数量自动选择合适的函数,这种选择规则被称为签名匹配算法。
函数重载意味着在重载的函数变体中,参数数量和/或类型必须不同。当调用重载函数时,根据调用函数时的参数列表与函数声明中的参数列表的对应关系来选择特定的函数变体。
函数重载的匹配算法
当调用重载函数时,编译器必须有一个算法来选择合适的函数。这个算法主要依赖于什么类型的转换存在。最佳匹配必须是唯一的。重载函数必须至少在一个参数上比所有其他变体更好地匹配,同时对于所有其他参数,它的匹配度不能比其他变体差。
下面是每个参数的匹配算法:
- 尽可能使用严格匹配;
- 尝试标准类型增加;
- 尝试标准类型转换。
标准类型增加比其他标准转换更好。增加是指float到double的转换,bool、char、short或enum到int的转换。也包括相似整数类型数组的类型转换。严格匹配最佳,为了实现这种一致性,可以使用类型转换。
需要注意的是,编译器无法处理模糊的情况。因此,不应依赖于类型的微妙差异和隐式转换,这会使重载函数变得不清晰。如果有疑虑,可以使用显式转换以确保严格的一致性。
MQL4中的重载函数示例可以在ArrayInitialize()
函数中找到。
函数重载规则也适用于类方法的重载。
系统函数的重载是允许的,但应注意编译器能够准确地选择所需的函数。例如,我们可以以四种不同的方式重载系统函数MathMax()
,但只有两种变体是正确的。
结论
函数重载是一个强大的工具,它可以让我们的代码更具有通用性和灵活性。在MQL4中,通过理解和利用函数重载,我们可以使我们的代码更加整洁和高效。