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, представленного в следующих уроках, вы будете использовать перегрузку функций для расширения возможностей своих программ.