Приведение типов данных: Си-стиль
Cи-стиль приведения типов данных доступен и языке C++, но считается не самодостаточным по сравнению с приведением типов в C++. Так как Си-стиль приведения типов не так точен, как C++-стиль приведения и не так заметен. Cи-стиль приведения типов данных может быть использован для преобразования любого типа в любой другой тип, при этом неважно насколько это небезопасное преобразование, например, преобразование целого числа в указатель типа int
). Казалось бы, такое преобразование невозможно, однако компилятор с нами не согласен, но выполнит это приведение. И каков получится результат. ему совершенно не важно. Смотрим синтаксис приведения типов данных согласно Си-стилю:
(type) val
где,
type
— тип данных к которому преобразуется значениеval
причем тип данных обязательно указывается в круглых скобочках.
Рассмотрим следующий пример использования Си-стиля приведения типа данных int
к типу double
.
double res = (double)13 / 7;
Этот пример приводит int
к типу double
для того, чтобы при делении 13-ти на 7 избежать усечения результата из-за целочисленного деления. Если вы плохо знакомы с приведением типов данных, прочтите статью: Явное и неявное приведение типов данных.
static_cast — унарная операция приведения типов данных в С++
Операция static_cast
доступна только в языке C++. static_cast может быть использована для преобразования одного типа в другой, но она не должна быть использована для выполнения недопустимого преобразования, например, преобразование значения в указатель или наоборот. Рекомендуется пользоваться операцией static_cast
, нежели Cи-стилем приведения, потому что static_cast
ограничивает недопустимое приведение типов и, следовательно — безопаснее.
Операция static_cast
, грубо говоря, — это шаблон функции, в которой необходимо явно указать тип данных для преобразования, то есть задать параметр шаблона.
static_cast<dataType>(value);
Итак, в треугольных скобочках указывается тип данных, к которому необходимо преобразовать значение value
, которое стоит в круглых скобочках. Смотрим все тот же пример, который приводит int
к типу double
для того, чтобы при делении 13-ти на 7 избежать усечения результата из-за целочисленного деления.
double res = static_cast<double>(13)/7;
dynamic_cast — унарная операция приведения типов данных в С++
Операция dynamic_cast
доступна только в C++ и имеет смысл только, применительно к членам класса иерархии «полиморфных типов». Динамическое приведение типов данных может быть использовано для безопасного приведения указателя (или ссылки) на суперкласс, в указатель (или ссылку) на подкласс в иерархии классов. Если динамическое приведение типов — недопустимо, так как реальный тип объекта, указывает не на тот тип подкласса, приведение типов не выполнится.
Динамическое приведение указателя
При приведении указателя, в случае неудачи, dynamic_cast
возвращает нулевой указатель NULL
. Такое поведение обеспечивает быстрый способ определения, является ли данный объект частностью динамического типа.
Синтаксис указателя динамического приведения:
type *subСlass = dynamic_cast<type *>( objPtr );
Динамическое приведение ссылки
При приведении ссылочной переменной, не возможно вернуть указатель, в случае неудачи. Поэтому будет вызвано исключение std::bad_cast
(из заголовочного файла <typeinfo>
).
type subСlass = dynamic_cast<type &>( objReference );
Чтобы безопасно пользоваться динамическим приведением, все вызовы dynamic_cast
должны быть обрамлены в блок Try/Catch
.
const_cast — константное приведение типов данных
Операция const_cast
доступна только в C++. Константное приведение используются, чтобы константную переменную преобразовать в неконстантную. При этом, константным становится возвращаемое значение операции const_cast
, а не сама переменная.
const_cast<dataType>(val);
Следующий пример преобразует константный указатель на символьную строку в неконстантный указатель на эту же строку.
void function(char *); // прототип функции с неконстантным параметром const char *string = "Sevastopol"; // константная строка function(const_cast<char *>(string));
reinterpret_cast — операция приведения типов данных
Операция reinterpret_cast
доступна только в C++ и является наименее безопасной формой приведения типов данных в С++, она позволяет интерпретировать значение в другой тип данных. reinterpret_cast
не должна быть использована для приведения иерархии классов или преобразования константных переменных.
reinterpret_cast<dataType>( value );
Рассмотрим пример использования этой операции приведения, например, чтобы преобразовать целое значение в указатель, нужно написать следующее:
reinterpret_cast<int *>(777);
Более подробно о приведении типов данных читайте в статье: Явное и неявное преобразование типов данных.
Комментарии
Tourist
type subСlass =
dynamic_cast
<type &>( objReference );
перед subСlass отсутствует &
npavelFax
Официальная работа на дому с обучением.