Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: dynamic_cast  (Прочитано 13073 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 30-11-2003 17:58 » 

Добрый день!

У меня вопрос:
Что такое и где используются различные dynamic_cast static_cast, что то слышал про const_cast.
Спасибо.
Записан
Serega
Гость
« Ответ #1 : 30-11-2003 21:20 » 

До того как эти операторы были включены в стандарт использовалось явное преобразование типов, например:
Код:
struct A
{
int i;
}

struct B
{
float f;
}

A* a = new A;
B* b = (B*)a;

b->f = 123.456
при записи значения будет затронута память не принадлежащая переменной класса A, т.к. sizeof(float) > sizeof(int)
Такое преобразование не безопасно, поэтому и были добавлены операторы пребразование типов, они перекладывают работу по определению корректно ли преобразование типов с програмиста на компилятор (что не может не радовать=)

Теперь мы можем написать так:
Код:
B* b = static_cast<B*>(a);
и быть абсолютно уверенными в том, что компилятор такого не допустит

с dynamic_cast немного по-другому:
Код:
B* b = dynamic_cast<B*>(a);
if( b != NULL )
{
    Error("указатель на A нельзя преобразовать к указателю на B");
}
разница в том, что static_cast работает на этапе компиляции, а dynamic_cast во время выполнения

const_cast подобен static_cast, но может убирать модификаторы const и volatile
Код:
const int i = 1;
int* j = const_cast<int*>(&i);
j = 123;


1153: текст поста до правки

До того как эти операторы были включены в стандарт использовалось явное преобразование типов, например:
Код:
struct A
|
int i;
"

struct B
|
float f;
"

A* a = new A;
B* b = )B*:a;

b->f = 123.456
при записи значения будет затронута память не принадлежащая переменной класса A, т.к. sizeof(float) > sizeof(int)
Такое преобразование не безопасно, поэтому и были добавлены операторы пребразование типов, они перекладывают работу по определению корректно ли преобразование типов с програмиста на компилятор (что не может не радовать=)

Теперь мы можем написать так:
Код:
B* b = static_cast<B*>)a:;
и быть абсолютно уверенными в том, что компилятор такого не допустит

с dynamic_cast немного по-другому:
Код:
B* b = dynamic_cast<B*>)a:;
if) b != NULL :
|
    Error)"указатель на A нельзя преобразовать к указателю на B":;
"
разница в том, что static_cast работает на этапе компиляции, а dynamic_cast во время выполнения

const_cast подобен static_cast, но может убирать модификаторы const и volatile
Код:
const int i = 1;
int* j = const_cast<int*>)&i:;
j = 123;
« Последнее редактирование: 25-08-2009 07:16 от Алексей1153++ » Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 30-11-2003 21:47 » 

Еще одно забыл:  :?
reinterpret_cast

Зачем он используется?

И еще:
Цитата

B* b = dynamic_cast<B*>(a);
if( b != NULL )
{
    Error("указатель на A нельзя преобразовать к указателю на B");
}

Может надо if(b == NULL)
Записан
Serega
Гость
« Ответ #3 : 30-11-2003 22:16 » 

reinterpret_cast это явное преобразование типов, т.е. можно любой тип привести к любому другому, правда есть небольшие ограничения - не может убрать const и volatile
в основном применяется когда необходимо указатель представить в виде числа

dynamic_cast возвращает NULL если не возможно выполнить безопасное преобразование, в примере такого сделать нельзя, поэтому и ошибка если не NULL
Записан
oapopov
Гость
« Ответ #4 : 24-01-2004 11:55 » new

Толковое объяснение с примерами можно найти на сайте Microsoft -
C/C++ Language Reference
Casting Operators
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/express_71.asp
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines