Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование dynamic_cast,static_cast,...

436
25 февраля 2007 года
Fevzi
87 / / 02.04.2005
Здравтсвуйте, господа программисты!
Объясните на примере зачем нужны четыре оператора:dynamic_cast,static_cast,const_cast,reinterpret_cast.Ну никак не могу понять их применение.
361
25 февраля 2007 года
Odissey_
661 / / 19.09.2006
Честно говоря, на эту тему лучше почитать "заслуженных" мастеров - страуструппа, александруску или липпмана с саттером.

Если о конкретных примерах, то я сталкивался в личной практике только с первым и третим.
dynamic_cast используется в том случае если объект может являться одним из предков, преобразуемого типа. Кроме того он возвращает 0 в случае неудачи и генерит исключение, что например не делает static_cast.

static_cast является скорее уходом от дурного тона, при программировании с неявным преобразованием типа, т.к. никаких исключений он не бросает. преобразовываю им простые типы - double к int`у например.

const_cast позволяет тебе сбить атрибуты типа const или volatile с преобразуемого параметра.

С reinterpret_cast вообще никогда на практике не сталкивался. помоему чаще всего используется при преобразовании указателей на разные типы.
355
25 февраля 2007 года
<SCORP>
786 / / 21.10.2006
вообще-то, это всё написано в MSDN'е...
const_cast -- убирает у переменной модификаторы const,volatile и __unaligned. что это за модификаторы -- читайте доки
static_cast -- преобразование типов без проверки во время выполнения. я так понял, что static_cast<classA*>(var) это то же самое, что и (classA*)var. поправьте, если не прав
dynamic_cast -- используется для приведения полиморфных типов, во время выполнения производятся проверки. позволяет обработать ошибки приведения типов с помощью обычного try\catch
reinterpret_cast -- просто изменяет трактовку области памяти. позволяет приводить целочисленные типы в указатель и наоброт

подробнее -- RTFM
320
25 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: Odissey_
Честно говоря, на эту тему лучше почитать "заслуженных" мастеров - страуструппа, александруску или липпмана с саттером.


Согласен на 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_:)

63
25 февраля 2007 года
Zorkus
2.6K / / 04.11.2006

вот
пример, когда требуется reinterpret_cast.
1
27 февраля 2007 года
kot_
7.3K / / 20.01.2000
static_cast - преобразование выполняется на этапе компиляции. Если преобразование не может быть выполнено - модуль не скомпилируется.
dynamic_cast - преобразование выполняется в процессе выполнения(на этапе компиляции не проверяется) и генерирует исключение в случае ошибки.
по поводу третьего - пример его хорошо иллюстрирует.
2.4K
28 февраля 2007 года
Lexogen
70 / / 18.05.2004
Наиболее понятно ою этом написано в Скотта Мейерса в книге "Наиболее эффективное использование С++" глава 1, правило 2.
Эту книгу легко найти в нете.
27K
01 марта 2007 года
nop2
1 / / 01.03.2007
Цитата: kot_

dynamic_cast - преобразование выполняется в процессе выполнения(на этапе компиляции не проверяется) и генерирует исключение в случае ошибки.



Исключение будет выброшено только если аргументом dynamic_cast является ссылочный тип. Если аргументом является указатель, то при возникновении ошибки будет возвращено null pointer value (5.2.7/9).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог