Справочник MQL4 Основы языка Типы данных Приведение типов
Приведение типовПреобразование числовых типовЧасто возникает необходимость преобразовать один числовой тип в другой. Не каждый числовой тип допустимо преобразовать в другой, допустимые преобразования в MQL4 показаны на схеме: Сплошные линии со стрелками обозначают преобразования, которые выполняются без потери информации. Вместо типа char может выступать тип bool (оба занимают в памяти 1 байт), вместо типа int можно использовать тип color (по 4 байта), а вместо типа long допустим тип datetime (занимают по 8 байт). Четыре штриховые линии серого цвета, также со стрелками, означают преобразования, при которых может произойти потеря точности. Например, количество цифр в целом числе 123456789 (int) превышает количество цифр, которое может быть представлено типом float.
Число, преобразованное в тип float, имеет тот же порядок, но несколько меньшую точность. Преобразования, обратные черным стрелкам, осуществляется с возможной потерей информацией. Преобразования между char и uchar, short и ushort, int и uint, long и ulong (имеются ввиду преобразования в обе стороны), могут привести к потере информации. В результате преобразования значения с плавающей точкой к целому типу дробная часть числа всегда отбрасывается. Если нужно округлить число с плавающей точкой до ближайшего целого числа (что во многих случаях является более полезным), необходимо использовать функцию MathRound(). Пример:
Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: Типы данных char, uchar, short и ushort в операциях безусловно приводятся к типу int. Примеры:
Вычисляемое выражение состоит из двух операций. В первом примере переменная c1 типа char преобразуется ко временной переменной типа int, так как второй операнд в операции деления, константа 2, имеет более старший тип int. В результате целочисленного деления 3/2 получается значение 1, которое имеет тип int. Во второй операции первого примера вторым операндом выступает константа 0.3, которая имеет тип double, поэтому результат первой операции преобразуется во временную переменную типа double со значением 1.0. Во втором примере переменная c1 типа char преобразуется ко временной переменной типа double, так как второй операнд в операции деления, константа 2.0, имеет тип double; дальнейших преобразований не производится.
Приведение числовых типовВ выражениях языка MQL4 можно использовать как явное, так и неявное приведение типов. Явное преобразование типов записывается следующим образом:
В качестве переменной var_2 может быть выражение или результат выполнения функции. Допускается также функциональная запись явного приведения типов:
Рассмотрим явное преобразование на основании первого примера.
Перед выполнением операции деления переменная c1 явно приводится к типу double. Теперь уже целочисленная константа 2 приводится к значению 2.0 типа double, так как в результате преобразования первый операнд получил тип double. Фактически, явное преобразование типов является одноместной операцией. Кроме того, при попытке приведения типов результат может выйти за пределы допустимого диапазона. В этом случае произойдет усечение. Например:
Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип. Примеры:
При преобразовании типа long/ulong в double может произойти потеря точности: если целое больше 9223372036854774784 или меньше -9223372036854774784.
Приведения для типа stringТип string имеет самый высокий приоритет среди простых типов. Поэтому, если в операции один из операндов имеет тип string, то другой операнд будет приведен к типу string автоматически. Следует иметь ввиду, что для типа string допустима единственная двуместная операция сложения. Допустимо явное приведение переменной типа string к любому числовому типу. Примеры:
Приведение данных типа простых структурДанные типа простых структур можно присваивать друг другу только в том случае, если все члены обеих структур имеют числовые типы. При этом в операции присваивания оба операнда, и слева и справа, должны быть типа структур. Как такового почленного приведения не производится, производится простое копирование. Если размеры структур отличаются, то копируется количество байт, соответствующее меньшему размеру. Таким образом компенсируется отсутствие объединений (union) в языке MQL4. Примеры:
Еще один пример показывает, как можно организовать собственную функцию для получения из типа color представления цвета в RGB (Red,Green,Blue). Для этого создаем две структуры, имеющие одинаковый размер, но разный внутренний состав. Для удобства, добавим в структуру функцию, возвращающую цвет в представлении RGB в виде строки.
Приведение типов указателей базовых классов к указателям производных классовОбъекты открыто порожденного класса могут также рассматриваться как объекты соответствующего ему базового класса. Это ведет к некоторым интересным следствиям. Например, вопреки тому факту, что объекты различных классов, порожденных одним базовым классом, могут существенно отличаться друг от друга, мы можем создать их связанный список (List), поскольку мы рассматриваем их как объекты базового типа. Но обратное неверно: объекты базового класса не являются автоматически объектами производного класса. Можно использовать явное приведение типов для преобразования указателей базового класса в указатели производного класса. Но необходимо быть полностью уверенным в допустимости такого преобразования, так как в противном случае возникнет критическая ошибка времени выполнения и mql4-программа будет остановлена. Динамическое приведение типов с помощью оператора dynamic_castСуществует возможность динамического приведения типов с помощью оператора dynamic_cast, который может быть применён только к указателям классов. При этом проверка корректности типов производится в момент выполнения программы. Это означает, что при использовании оператора dynamic_cast компилятор не производит проверку типа данных, используемого для приведения. В случае, если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, результатом будет значение NULL.
Параметр type-id в угловых скобках должен быть указателем на ранее определённый тип класса. Тип операнда expression (в отличии от C++) может быть любым, кроме void. Пример:
Смотри также |