![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Предисловие:
Иногда необходимо производить явное преобразование типа. Я понимаю, что это, скорее всего, из-за неправильной архитектуры, но ситуации бывают разные. Например, если используешь готовую функцию, как в QIODevice
если у меня массив unsigned char x[1000], то я должен в явном виде преобразовать указатель на него к char*. Я всегда ( по привычке, а не потому, что это правильно ) делаю преобразование в стиле Си
Вопрос: в чём существенное отличие такого преобразования от Си++-сного reinterpret_cast. И в чём отличие reinterpret_cast от static_cast. Спасибо Это сообщение отредактировал(а) borisbn - 16.9.2010, 10:08 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| proc_maker |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 11.11.2006 Репутация: нет Всего: 1 |
Привет.
Преобразование в стиле С приводит без проверки типов данных при условии что кастование таких типов впринципе возможно. static_cast является почти аналогом сишного кастования но добавляет проверки типов:
>> И в чём отличие reinterpret_cast от static_cast. reinterpret_cast применяется при кастовании поинтеров:
|
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
второй, умеет бросать исключение при невозможности каста. вот Добавлено через 44 секунды вай, Алена фотку сменила. |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
| azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
вообще рекомендуется использовать C++ style cast, но в данном случае сложно назвать какую-то существенную причину. reinterpret_cast не проверяет ничего, просто проводит cast. Какой угодно указатель к другому (какому угодно).
static_cast проводит compile-time проверку, там, где это возможно например
а вот в этом случае все будет работать
иногда возникают ситуации, когда compile-time проверки недостаточно
тут можно использовать dynamic_cast, он проверяет runtime, при ошибке приведения возвращает NULL (если возвращает указатель) или генерирует исключение, если возвращает reference. Добавлено через 37 секунд Добавлено через 1 минуту и 17 секунд а static_cast типа этого не умеет? |
||||||||||
|
|||||||||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
глупости, даже преобразовывать не нужно, нужно только понимать чем unsigned char от char отличается в случает применения логических и орифметических операций -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
и даже это ? :
разочарую вас, но reinterpret_cast тоже проверяет возможность преобразования, но по своим правилам в отличии от static_cast. главное отличие в том, что reeinterpret осуществляет "прямое" преобразование, а static, учитывая правила преобразования ( стандартные либо пользовательские для соотв. типов). может стоит проверить ? |
||||||
|
|||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
нет, это уж слишком даже для reinterpret_cast, эти указатели размером не совместимы.
имелась ввиду проверка по иерархии классов (показано на примере). reinterpret_cast этого не делает. Это сообщение отредактировал(а) azesmcar - 16.9.2010, 11:56 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
интересно, что подразумевается под словом "проверка" ? Это сообщение отредактировал(а) mes - 16.9.2010, 11:56 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тогда следующий вопрос: есть класс B некий наследник класса А, соответсвенно преобразование возможно. Раз проверка прошла, то результат будет всегда ли одинаков в обоих случаях ?
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Нет, не всегда. reinterpret_cast игнорирует vtable pointer. Добавлено через 39 секунд хотя я не совсем понял каким образом этот вопрос связан с темой проверки возможности преобразования? |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
azesmcar, нет, размер указателя на член класса зависит еще и от ОС и назначения этого члена класса.
в ряде случаев ОС будет гарантировать что указатель на член класса будет обычным указателем |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |