reinterpret_cast 연산자에 대해.............. www.winapi.com에 있는 강좌를 토대로 정리한다

 

이 캐스트 연산자는 임의의 포인터 타입끼리 변환을 허용하는 상당히 위험한 캐스트 연산자이다. 심지어 정수형과 포인터간의 변환도 허용한다

정수형 값을 포인터 타입으로 바꾸어 절대 번지를 가르키거나 할때 이연산자를 사용한다

 

int *pi;

char *pc;

pi = reinterpret<int*>(12345678);

pc = reinterpret<char*>(pi);

1234568이라는 정수형값을 정수형 포인터로 바꾸어 pi에 대입 할수도 있고 이 값을 다시 문자형 포인터로 바꾸어 pc에 대입할수도 있다

상속 관계에 있지 않은 포인터 끼리도 변환가능하다 대입을 허가하기는 하지만 이렇게 대입한후 pi,pc 포인터를 사용해서 발생하는 문제는 전적으로 개발자가

책임져야 한다 일종의 강제 변환이므로 안전하지 않고 이식성도 없다

 이 연산자는 포인터 타입간의 변환이나 포인터와 수치형 데이타 변환에만 사용하며 기본타입들끼리의 변환에는 사용할수 없다 예를 들어 정수형을

실수형으로 바꾸거나 실수형을 정수형으로 바꾸는 것은 허락하지 않는다.  이럴때는 static_cast연산자를 사용한다

 

    C++ 캐스트 연산자 사용형태 4가지 정리

  

         static_cast           상속관계의 클래스 포인터 및 레퍼런스. 기본타입. 타입체크안함

         dynamic_cast        상속관계의 클래스 포인터 및 레퍼런스. 타입체크  RTTI기능 필요

         const_cast            const,volatile 등의 속성 변경

         reinterpret_cast    포인터끼리 , 포인터와 수치형간의 변환

 

 

** 연산자별로 가능한 연산자가 잇고 그렇지 않은 연산이 있으므로 목적에 맞게 골라서 사용해야 하며 부주의한 캐스팅을 조금이라도 방지하는 효과가 잇다

컴파일러는 캐스트 연산자의 목적에 맞게 제대로 캐스팅 햇는지 컴파일러중에 미리 에러를 발견할수 잇을것이다 그리고 모양이

아주 특이하기때문에 캐스트 연산자는 금방 알아볼수 있다는 점도 또 다른 이점이기도 하다

변수의 타입을 변경하는 캐스트 연산자는 어떠한 경우라도 항상주의해서 사용해야 한다 아무타입이나 마음대로 바꿀수 잇는것이 아니고 바꾼후의 효과에대해서는 개발자가 책임을 져야한다 예를들어 정수형과 구조체는 어떤 캐스트연산자도 상호 변환할수없다 심지어 C의 캐스트 연산자도 이런캐스팅은 허용하지 않는다 어느모로 보나 정수와 구조체는 호환되지 않는 타입이며 변환할 필요성도 거의 없다 C++ 캐스트 연산자도 정도가 다르지만 위험하기는 역시 마찬가지이다

+ Recent posts