Приведение типов - это, по сути, преобразование одного типа в другой. Он может быть неявным (т. Е. Выполненным автоматически компилятором, возможно, теряющим информацию в процессе) или явным (т. Е. Указанным разработчиком в коде). Пространство, занимаемое типами, имеет второстепенное значение. Более важным является применимость (а иногда и удобство) конвертации.
Возможно, что неявные преобразования могут потерять информацию, признаки могут быть потеряны / получены, и может произойти переполнение / недополнение. Компилятор не защитит вас от этих событий, за исключением, возможно, предупреждения, которое генерируется во время компиляции. Разделение также может происходить, когда производный тип неявно преобразуется в базовый тип (по значению).
Для преобразований, которые могут быть совершенно опасными (например, из базы в производный тип), стандарт C ++ требует явного приведения. Кроме того, он предлагает более ограниченные явные приведения, такие как static_cast
, dynamic_cast
, reinterpret_cast
и const_cast
, каждое из которых дополнительно ограничивает явное приведение только подмножеством возможных преобразований, уменьшая потенциальные за ошибки приведения.
Допустимые преобразования, как неявные, так и явные, в конечном итоге определяются стандартами C / C ++, хотя в C ++ разработчик имеет возможность расширять преобразования для пользовательских типов, как неявных, так и явных, с использованием конструкторов и перегруженных ( операторы.
Полные правила, для которых приведение стандартов разрешено, а какие нет, могут стать довольно запутанными. Я постарался правдиво представить несколько кратких резюме некоторых из этих правил в этом ответе. Если вы действительно заинтересованы в том, что разрешено и запрещено, я настоятельно призываю вас ознакомиться со стандартами и прочитать соответствующие разделы о преобразовании типов.