Необязательные параметры
MQL5 предоставляет возможность при описании функции указать для параметров значения по умолчанию. Для этого используется синтаксис инициализации, то есть литерал соответствующего типа справа от параметра, после знака '='. Например:
void function(int value = 0); |
При вызове функции аргументы для таких параметров можно не указывать. Тогда их значения будут установлены равными величинам по умолчанию. Подобные параметры называются необязательными (опциональными).
Необязательные параметры должны располагаться в конце списка параметров. Иными словами, если i-й параметр описан с инициализацией, то все последующие также должны её иметь. В противном случае выдается ошибка компиляции "пропущено значение по умолчанию для параметра" ("missing default value for parameter"). Ниже показано описание функции с такой проблемой.
double Largest(const double v1, const double v2 = -DBL_MAX,
|
Решений два: либо параметр v3 также должен иметь значение по умолчанию, либо параметр v2 должен стать обязательным.
Опускать необязательные аргументы при вызове функции можно только в направлении справа налево. То есть, если у функции два параметра и оба необязательные, то при вызове нельзя пропустить первый, но указать второй. Одиночное переданное значение будет сопоставлено с первым параметром, второй будет считаться опущенным. Если отсутствуют оба аргумента, пустые круглые скобки все равно нужны.
Рассмотрим функцию поиска максимального числа из трех. Первый параметр — обязательный, два последних — опциональные и равны по умолчанию минимально возможному числу типа double. Таким образом, каждый из них в отсутствии явно переданного значения будет заведомо меньше (или, в крайнем случае, равен) всех остальных параметров.
double Largest(const double v1, const double v2 = -DBL_MAX,
|
Вот как её можно вызвать:
Print(Largest(1)); // ok: 1
|
С помощью необязательных параметров в MQL5 реализуется концепция функций с переменным количеством параметров в пользовательских функциях.
MQL5 не поддерживает синтаксис определения функций с переменным числом параметров с помощью многоточия (ellipsis), как в C++. Вместе с тем, в MQL5 API существуют встроенные функции, которые описаны с использованием многоточия и принимают переменное количество произвольных параметров. В частности, к ним относится известная нам функция Print. Её прототип выглядит так: void Print(argument, ...). Поэтому мы можем вызвать её, указав через запятую вплоть до 64 аргументов (за исключением массивов) и она отобразит их в журнале.