Основы языка
© 2000-2011, MetaQuotes Software Corp.
129
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
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);
}
//--- Результат работы скрипта
// Вычисление среднего для массива типа int
// Вычисление среднего для массива типа double
// int_aver= 3.00000000 double_aver= 3.30000000
Перегрузкой называется практика придания нескольких значений функции. Выбор конкретного
значения зависит от типов аргументов, полученных функцией. Конкретная функция выбирается в
зависимости от соответствия списка аргументов при вызове функции списку параметров в
объявлении функции.
Когда вызывается перегруженная функция, компилятор должен иметь алгоритм для выбора
надлежащей функции. Алгоритм, который выполняет этот выбор, зависит от того, преобразования
какого типа присутствуют. Наилучшее соответствие должно быть уникальным. Оно должно быть
лучшим по крайней мере для одного аргумента и также хорошо, как остальные соответствия, для
всех других аргументов.
Ниже приведен алгоритм соответствия для каждого аргумента.
Алгоритм выбора перегруженной функции
1. Использовать строгое соответствие (если это возможно).
2. Попробовать стандартное повышение типа.
3. Попробовать стандартное преобразование типа.
Стандартное повышение типа лучше, чем остальные стандартные преобразования. Повышение -
это преобразование float в double, а также bool, char, short или enum в int. Кроме того, к
стандартным преобразованиям относятся преобразования массивов похожих целыхтипов.
Похожими типами являются: bool, char, uchar, так как все три типа являются однобайтовыми
целыми; двубайтовые целые short и ushort; 4-байтовые целые int, uint и color; long, ulong и
datetime.
Несомненно, строгое соответствие является наилучшим. Для достижения такого соответствия
могут использоваться приведения. Компилятор не справится с двусмысленной ситуацией. Поэтому
не следует полагаться на тонкие различия в типах и неявные преобразования, которые делают
перегруженную функцию неясной.
Если Вы сомневаетесь, используйте явные преобразования для обеспечения строгого
соответствия.
Примеры перегруженных функций в MQL5 Вы можете увидеть на примере функций ArrayInitialize()
.