C++ Программирование в среде С++ Builder 5

         

Reinterpret_cast


Синтаксис данной формы операции приведения таков:

reinterpret_cast<Целевой_тиn> (аргумент)

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

Целевой_тип может быть типом ссылки, указателя, целым, перечислимым или вещественным типом.

Если целевой_тип — тип указателя или ссылки, то аргумент может быть указателем или ссылкой, а также числовой (вещественной, целой, перечислимой) переменной; когда целевым типом является числовой тип, то операнд может быть указателем или ссылкой.

Операция возвращает значение целевого типа.

Возможно, например, явное преобразование указателя в целый тип, равно как и обратная операция. Можно приводить указатель на функцию одного •типа к указателю на функцию другого типа или на некоторый объект, при условии, что он (указатель на объект) имеет достаточную разрядность.

Вот пример преобразования указателя в целое и наоборот:

////////////////////////////////////////////////

// Reinterpret.срр: Демонстрация reinterpret_cast

//

#include <iostream.h>

#pragma hdrstop

#include <condefs.h>

int main () {

int i = 7;



int *ip = Si;

int temp = reinterpret cast<int>(ip);

cout.setf(ios::showbase) ;

cout << "Pointer value is"<< ip << end1;

cout << "Representation of a pointer as int is " << hex << temp << endl;

cout << "Convert it back and dereference:"<<*reinterpret_cast<int*>(temp) << endl;

return 0;

}

Эта программа выводит:

Pointer value is 0065FEOO

Representation of a pointer as int is Ox65fe00

Convert it back and dereference: 0х7

Все это можно проделать, разумеется, и с помощью обычных операций приведения, однако последние мало надежны. Тут при опечатках могут происходить совершенно дикие преобразования, и компилятор не выдает даже предупреждающих сообщений. Специальные же операции имеют более корректный вид и явно показывают, что вы делаете.



Содержание раздела