Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   reinterpret_cast (http://forum.oszone.net/showthread.php?t=29748)

bilytur 05-05-2004 03:36 205608

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

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

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

hasherfrog 05-05-2004 09:05 205609

На мой взгляд, имеет смысл рассматривать данный оператор только вместе с остальными (dinamic_cast и т.д.). Его использование убирает некоторую неоднозначность, даёт точно понять, что программер хотел получить проcто биты (от машинного адреса).
Код:

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

Могу ошибаться, впрочем... Поправьте, если что.

bilytur 06-05-2004 03:03 205610

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

ivank 07-05-2004 02:03 205611

bilytur
reinterpret_cast не снимает константности, в отличие от сишного приведения. Для этого есть const_cast, который изредка даже оправдан в использовании. А вообще, любые приведения помимо автоматических - вредны по определению.
Код:

int main()
{
        const int * a(0x0);
        int * b;
        b = (int*)a; // не ругается
        b = reinterpret_cast<int*>(a); // ругается
        return 0;
}


bilytur 07-05-2004 04:06 205612

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


Время: 02:24.

Время: 02:24.
© OSzone.net 2001-