重载函数

通常函数名反映它的作用。一般说来,可读程序包括各种挑选出来的标识符 。有时不同的函数用于同样的作用。例如,计算双精度数数组的平均值的函数,也会操作整数数组。都可以称为数组平均数AverageFromArray:

//+------------------------------------------------------------------+
//| 双精度类型数组的平均数计算                                           |
//+------------------------------------------------------------------+
double AverageFromArray(const double array[],int size)
  {
   if(size<=0) return 0.0;
   double sum=0.0;
   double aver;
//---
   for(int i=0;i<size;i++)
     {
      sum+=array[i];    // 添加到双精度型
     }
   aver=sum/size;       // 正好总数被数字除
//---
   Print("Calculation of the average for an array of double type");
   return aver;
  }
//+------------------------------------------------------------------+
//| 整型数组的平均数计算                                                |
//+------------------------------------------------------------------+
double AverageFromArray(const int array[],int size)
  {
   if(size<=0) return 0.0;
   double aver=0.0;
   int sum=0;
//---
   for(int i=0;i<size;i++)
     {
      sum+=array[i];     // 添加到双精度
     }
   aver=(double)sum/size;// 给予双精度类型总值,并且相除
//---
   Print("Calculation of the average for an array of int type");
   return aver;
  }

每个函数通过 Print()函数输出信息;

   Print("Calculation of the average for an array of int type");

程序选择与自变量类型及其数量一致的必需的函数。选择依据的规则,称为署名匹配算法。署名就是用于说明函数类型的列表。

示例:

//+------------------------------------------------------------------+
//| 脚本程序启动函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int    a[5]={1,2,3,4,5};
   double b[5]={1.1,2.2,3.3,4.4,5.5};
   double int_aver=AverageFromArray(a,5);
   double double_aver=AverageFromArray(b,5);
   Print("int_aver = ",int_aver,"   double_aver = ",double_aver);
  }
//--- 脚本结果
// 为整型数组计算平均值
// 为双精度型数组计算平均值
// 整型 平均值= 3.00000000    双精度 平均值= 3.30000000

重载就是一个函数定义多值。根据函数接收的自变量类型选择特定的值。基于调用函数时对应的自变量列表选择特定的函数,到函数说明参数列表。

当调用重载的函数,程序必需有一个运算法则选择合适的函数。该算法是依据现有类型的转化完成这个选择。最佳关联是唯一的。至少对于一个自变量来说,是最好的,对其他相关的自变量也是一样。

以下就是每个自变量匹配的算法。

选择一个重载函数的运算法则

  1. 匹配严格(尽可能)。
  2. 尝试标准类型提高。
  3. 尝试标准类型转换。

标准类型提高好于其他标准转换。提高就是浮点型双精度型转换,布尔型字符型短整型或者计数整型转换。类似整型数组的类型转换也属于类型转换。相似类型有:布尔型,字符型,无符号字符型,这三种都是单字节整数;双字节整数是短整型和无符号短整型;4字节整数是整型,无字符整型,和颜色;长整型,无符号长整型,和日期时间。

当然,匹配严格是最好的。若要达到这样的一致性,就要使用类型转换。编译程序不能处理含糊状况。因此不能依靠类型的微妙不同点和使重载函数不明确的隐式变换。

如果怀疑,请使用显式转换确保严格相符。

MQL5中重载的函数可以在ArrayInitialize()函数示例中看到。

函数重载规则用于类函数重载

允许系统函数重载,但是要注意到编译程序可以准确的选择必要函数。例如,用三种不同方法重载系统函数 fmax(),但是仅有两个变量是正确的。

示例:

// 允许重载-在参数数字上不同
double fmax(double a,double b,double c);
 
// 错误重载
// 参数是不同的,但是最后一个有默认值
// 这就导致系统函数的隐藏,不可接受调用
double fmax(double a,double b,double c=DBL_MIN);
 
// 通过参数类型正常重载
int fmax(int a,int b);

另见

重载虚拟函数多态