Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » reinterpret_cast

Ответить
Настройки темы
reinterpret_cast

Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


Зачем он нужен понятно, к примеру указатель в int конвертнуть:
char *p;
int v = reinterpret_cast<int>(p);

Но то-же самое можно сделать и просто:
int v = (int)(p);

Так зачем писать такое длинное слово?
Приведите пример в котором reinterpret_cast работает
а простой "cast" нет.

Отправлено: 03:36, 05-05-2004

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


На мой взгляд, имеет смысл рассматривать данный оператор только вместе с остальными (dinamic_cast и т.д.). Его использование убирает некоторую неоднозначность, даёт точно понять, что программер хотел получить проcто биты (от машинного адреса).
Код: Выделить весь код
class A; 
class B : public A; 
A a; 
B* b = (B*)&a; <-- фиг его знает, чего надо: то ли адрес как класса А, то ли как В (хотя вероятно, что имелось в виду приведение полиморфных типов) 
B* b = reinterpret_cast<B>(&a);  <-- понятно, нужен адрес а как класса А (хотя мы явно нарываемся на ошибку, для использования методов А надо делать dinamic_cast)
Могу ошибаться, впрочем... Поправьте, если что.

Отправлено: 09:05, 05-05-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ну вобщем как я понял, обычное приведение типа
int v = (int)(p); можно считать "тяжелым" наследием С.
А С++ введя кучу всякой всячины, dinamic_cast и пр. и пр. для единообразия ввел и reinterpret_cast.
Хотя особой нужды в нем видимо нет.
Спасибо за разъяснение.

Отправлено: 03:03, 06-05-2004 | #3


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


bilytur
reinterpret_cast не снимает константности, в отличие от сишного приведения. Для этого есть const_cast, который изредка даже оправдан в использовании. А вообще, любые приведения помимо автоматических - вредны по определению.
Код: Выделить весь код
int main()
{
	const int * a(0x0);
	int * b;
	b = (int*)a; // не ругается
	b = reinterpret_cast<int*>(a); // ругается
	return 0;
}

-------
http://ivank.ru


Отправлено: 02:03, 07-05-2004 | #4


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


На счет константности не знал, спасибо.

Отправлено: 04:06, 07-05-2004 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » reinterpret_cast

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено




 
Переход