Урок №9: Перегрузка функций

MQL4 позволяет определять несколько функций с одинаковым именем. Такие функции называются перегруженными. Их может быть две, три и больше и различаются они порядком следования, количеством, типом. Таким образом перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих подобные действия, но с различной программной логикой. В конечном счёте перегрузка функций улучшает удобочитаемость программ.

Например, предположим, что в вашей программе есть функция с именем day_of_week, которая возвращает текущий день недели (0 для воскресенья, 1 для понедельника, …, 6 для субботы). Ваша программа могла бы перегрузить эту функцию таким образом, чтобы она верно возвращала день недели, если ей передан юлианский день в качестве параметра, или если ей переданы день, месяц и год:

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
int day_of_week(int julian_day)
{
   // Операторы
} 

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
int day_of_week(int month, int day, int year)
{
   // Операторы
}

 

Перегруженные функции выбираются для оптимального соответствия объявлений функций в текущей области аргументам, предоставленным в вызове функции. Если подходящая функция найдена, эта функция вызывается. «Подходящая» в данном контексте означает одно из следующего.

  • Точное соответствие найдено.
  • Тривиальное преобразование выполнено.
  • Восходящее приведение целого типа выполнено.
  • Стандартное преобразование в требуемый тип аргумента существует.
  • Пользовательское преобразование (оператор преобразования или конструктор) в требуемый тип аргумента существует.
  • Аргументы, представленные многоточием, найдены.

Компилятор создает набор функций-кандидатов для каждого аргумента. Функции-кандидаты — это функции, в которых фактический аргумент в данной позиции можно преобразовать в тип формального аргумента.

Для каждого аргумента создается набор наиболее подходящих функций, и выбранная функция представляет собой пересечение всех наборов. Если на пересечении находится несколько функций, перегрузка является неоднозначной и выдает ошибку. Функция, которая выбирается в конечном итоге, всегда является самой подходящей по сравнению с остальными функциями в группе по крайней мере для одного аргумента. В противном случае (если невозможно определить наиболее подходящую функцию) при вызове функции выдается ошибка.

Для примера, создадим простую функцию max, которая будет определять максимальное из двух целых чисел.

/* Функция max для целых чисел */
int max(int num1, int num2)
{
   if (num1 > num2)
     return num1;

   return num2;
}

В эту функцию мы можем передавать только целочисленные параметры. Для того, чтобы сделать аналог этой функции для чисел с плавающей запятой, выполним перегрузку этой функции:

/* Функция max для чисел с плавающей запятой */
double max(double num1, double num2)
{
   if (num1 > num2)
     return num1;

   return num2;
}

Теперь, когда мы будет вызывать функцию max с целыми параметрами, то вызовется первая функция. А если с дробными — то вторая.

void OnTick()
{
    // Здесь будет использоваться первый вариант функции max
    int imax = max(1, 10);

    // А здесь - второй
    double dmax = max(1.0, 20.0);
}

В процессе изучения объектно-ориентированного программирования в языке MQL4, представленного в следующих уроках, вы будете использовать перегрузку функций для расширения возможностей своих программ.

 

Written by 

Добавить комментарий