![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Читаю пока учебник по С++, там нарисован один из вариантов приведения типов. Я привык, что приведение к типу делается вот таким макаром:
Что по идее приводит double к int. Это срабатывает. В учебнике другой пример:
Он делает то же самое. Но я как-то встречал в коде dynamic_cast<>(). Когда я попробовал в коде сверху заменить static на dynamic, мне выдалась ошибка, что нельзя приводить тип double к типу int. Почему? |
||||
|
|||||
| _hunter |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
в отличии от
-------------------- Tempora mutantur, et nos mutamur in illis... |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Чтобы использовать dynamic_cast, нужно, во-первых, включить поддержку RTTI, во-вторых целевой тип (к которому приводишь) должен быть указателем или ссылкой на полиморфный тип, т.е. тип, содержащий виртуальные функции. Это потому, что RTTI тоже (обычно) хранится в vtable.
-------------------- ... |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Гм. А какая разница между просто (int) и static_cast<int>(...)? И есть ли она вообще?
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
по сути -- никакой.
() выполняет все типы кастинга а ХХХ_cast<> -- только совего _типа_ . первый -- старый (из С) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В данном случае (для int) нет. Но если преобразовывать указатель на один класс к указателю на другой, то преобразование в стиле C (т.е. (Class*)) скомпилируется почти всегда, а вот для static_cast компилятор проверит, что классы из одной иерархии и будет ругаться, если это не так. Кроме того, Мейерс и прочие гуру рекомендует использовать операторы преобразования (xxx_cast) вместо приведения в стиле C для более четкого выделения в коде и явной декларации намерений. В принципе, приведение в стиле С способно заменить все операторы приведения C++, кроме dynamic_cast (есть еще const_cast и reinterpret_cast).
В некотором роде, это вопрос стиля. Я, для приведения между встроенными типами, по привычке использую приведение C, а для классов - один из операторов C++. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |