Использование dynamic_cast,static_cast,...
Объясните на примере зачем нужны четыре оператора:dynamic_cast,static_cast,const_cast,reinterpret_cast.Ну никак не могу понять их применение.
Если о конкретных примерах, то я сталкивался в личной практике только с первым и третим.
dynamic_cast используется в том случае если объект может являться одним из предков, преобразуемого типа. Кроме того он возвращает 0 в случае неудачи и генерит исключение, что например не делает static_cast.
static_cast является скорее уходом от дурного тона, при программировании с неявным преобразованием типа, т.к. никаких исключений он не бросает. преобразовываю им простые типы - double к int`у например.
const_cast позволяет тебе сбить атрибуты типа const или volatile с преобразуемого параметра.
С reinterpret_cast вообще никогда на практике не сталкивался. помоему чаще всего используется при преобразовании указателей на разные типы.
const_cast -- убирает у переменной модификаторы const,volatile и __unaligned. что это за модификаторы -- читайте доки
static_cast -- преобразование типов без проверки во время выполнения. я так понял, что static_cast<classA*>(var) это то же самое, что и (classA*)var. поправьте, если не прав
dynamic_cast -- используется для приведения полиморфных типов, во время выполнения производятся проверки. позволяет обработать ошибки приведения типов с помощью обычного try\catch
reinterpret_cast -- просто изменяет трактовку области памяти. позволяет приводить целочисленные типы в указатель и наоброт
подробнее -- RTFM
Согласен на 100%.примеры использования можно посмотреть в MSDN.
Ну если облом читать то в 2 словах могу пересказать упомянутого Odissey_ Липпмана примерно так.
Все они предназаначены для преобразования типов.Синтаксис операции явного преобразования типов таков:
cast_name< type >( expression );
cast_name – одно из ключевых слов static_cast, const_cast, dynamic_cast или reinterpret_cast, а type – тип, к которому приводится выражение.
Эти операторы введены для того, чтобы учитывать все возможные формы приведения типов.
1. const_cast - для трансформации константного типа в неконстантный и подвижного (volatile) – в неподвижный.
2. static_cast - осуществляет преобразования, которые могут быть сделаны неявно, на основе правил по умолчанию.Кроме того, с помощью static_cast указатель void* можно преобразовать в указатель определенного типа, арифметическое значение – в значение перечисления (enum), базовый класс – в производный.
3.reinterpret_cast - работает с внутренними представлениями объектов (reinterpret – другая интерпретация того же внутреннего представления), причем правильность этой операции целиком зависит от программиста.
4. dynamic_cast - применяется при идентификации типа во время выполнения (run-time type identification).
Но лучше последуй совету Odissey_:)
вот пример, когда требуется reinterpret_cast.
dynamic_cast - преобразование выполняется в процессе выполнения(на этапе компиляции не проверяется) и генерирует исключение в случае ошибки.
по поводу третьего - пример его хорошо иллюстрирует.
Эту книгу легко найти в нете.
dynamic_cast - преобразование выполняется в процессе выполнения(на этапе компиляции не проверяется) и генерирует исключение в случае ошибки.
Исключение будет выброшено только если аргументом dynamic_cast является ссылочный тип. Если аргументом является указатель, то при возникновении ошибки будет возвращено null pointer value (5.2.7/9).