- Целые типы
- Вещественные типы (double, float)
- Комплексное число (complex)
- Тип string
- Структуры, классы и интерфейсы
- Объект динамического массива
- Матрицы и векторы
- Приведение типов
- Тип void и константа NULL
- Пользовательские типы
- Указатели объектов
- Ссылки. Модификатор & и ключевое слово this
Приведение типов
Преобразование числовых типов
Часто возникает необходимость преобразовать один числовой тип в другой. Не каждый числовой тип допустимо преобразовать в другой, допустимые преобразования в MQL5 показаны на схеме:
Сплошные линии со стрелками обозначают преобразования, которые выполняются без потери информации. Вместо типа char может выступать тип bool (оба занимают в памяти 1 байт), вместо типа int можно использовать тип color (по 4 байта), а вместо типа long допустим тип datetime (занимают по 8 байт). Четыре штриховые линии серого цвета, также со стрелками, означают преобразования, при которых может произойти потеря точности. Например, количество цифр в целом числе 123456789 (int) превышает количество цифр, которое может быть представлено типом float.
int n=123456789;
|
Число, преобразованное в тип float, имеет тот же порядок, но несколько меньшую точность. Преобразования, обратные черным стрелкам, осуществляется с возможной потерей информацией. Преобразования между char и uchar, short и ushort, int и uint, long и ulong (имеются ввиду преобразования в обе стороны), могут привести к потере информации.
В результате преобразования значения с плавающей точкой к целому типу дробная часть числа всегда отбрасывается. Если нужно округлить число с плавающей точкой до ближайшего целого числа (что во многих случаях является более полезным), необходимо использовать функцию MathRound().
Пример:
//--- ускорение свободного падения
|
Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме:
Типы данных char, uchar, short и ushort в операциях безусловно приводятся к типу int.
Примеры:
char c1=3;
|
Вычисляемое выражение состоит из двух операций. В первом примере переменная c1 типа char преобразуется ко временной переменной типа int, так как второй операнд в операции деления, константа 2, имеет более старший тип int. В результате целочисленного деления 3/2 получается значение 1, которое имеет тип int.
Во второй операции первого примера вторым операндом выступает константа 0.3, которая имеет тип double, поэтому результат первой операции преобразуется во временную переменную типа double со значением 1.0.
Во втором примере переменная c1 типа char преобразуется ко временной переменной типа double, так как второй операнд в операции деления, константа 2.0, имеет тип double; дальнейших преобразований не производится.
Приведение числовых типов
В выражениях языка MQL5 можно использовать как явное, так и неявное приведение типов. Явное преобразование типов записывается следующим образом:
var_1 = (тип)var_2; |
В качестве переменной var_2 может быть выражение или результат выполнения функции. Допускается также функциональная запись явного приведения типов:
var_1 = тип(var_2); |
Рассмотрим явное преобразование на основании первого примера.
//--- третий пример
|
Перед выполнением операции деления переменная c1 явно приводится к типу double. Теперь уже целочисленная константа 2 приводится к значению 2.0 типа double, так как в результате преобразования первый операнд получил тип double. Фактически, явное преобразование типов является одноместной операцией.
Кроме того, при попытке приведения типов результат может выйти за пределы допустимого диапазона. В этом случае произойдет усечение. Например:
char c;
|
Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип.
Примеры:
int i=1/2; // приведения типов нет, результат: 0
|
При преобразовании типа long/ulong в double может произойти потеря точности: если целое больше 9223372036854774784 или меньше -9223372036854774784.
void OnStart()
|
Приведения для типа string
Тип string имеет самый высокий приоритет среди простых типов. Поэтому, если в операции один из операндов имеет тип string, то другой операнд будет приведен к типу string автоматически. Следует иметь ввиду, что для типа string допустима единственная двуместная операция сложения. Допустимо явное приведение переменной типа string к любому числовому типу.
Примеры:
string s1=1.0/8; // выражение приводится к типу double,
|
Приведение типов указателей базовых классов к указателям производных классов
Объекты открыто порожденного класса могут также рассматриваться как объекты соответствующего ему базового класса. Это ведет к некоторым интересным следствиям. Например, вопреки тому факту, что объекты различных классов, порожденных одним базовым классом, могут существенно отличаться друг от друга, мы можем создать их связанный список (List), поскольку мы рассматриваем их как объекты базового типа. Но обратное неверно: объекты базового класса не являются автоматически объектами производного класса.
Можно использовать явное приведение типов для преобразования указателей базового класса в указатели производного класса. Но необходимо быть полностью уверенным в допустимости такого преобразования, так как в противном случае возникнет критическая ошибка времени выполнения и mql5-программа будет остановлена.
Динамическое приведение типов с помощью оператора dynamic_cast #
Существует возможность динамического приведения типов с помощью оператора dynamic_cast, который может быть применён только к указателям классов. При этом проверка корректности типов производится в момент выполнения программы. Это означает, что при использовании оператора dynamic_cast компилятор не производит проверку типа данных, используемого для приведения. В случае, если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, результатом будет значение NULL.
dynamic_cast <type-id> ( expression ) |
Параметр type-id в угловых скобках должен быть указателем на ранее определённый тип класса. Тип операнда expression (в отличии от C++) может быть любым, кроме void.
Пример:
class CBar { };
|
Смотри также