본문 바로가기

예전/C, C++

[C++] reinterpret_cast


reinterpret 의 뜻대로 캐스팅 하려는 것을 타겟의 타입으로 비트단위로 다시 재해석하는 casting 연산자이다.

다른 3개의 캐스팅 연산자가 처리하지 못한 일을 수행한다. 

reinterpret_cast는 관계가 없는 타입간의 변환을 한다. 하지만, const_cast의 기능인 상수성을 없애는 일은 하지 못한다.


C연산자 만큼 casting이 자유롭지만 결과는 보장할 수 없다. 


[예제 1]



error C2440: '=' : 'int'에서 'char *'(으)로 변환할 수 없습니다.

1>          정수 계열 형식에서 포인터 형식으로 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.

error C2440: 'static_cast' : 'int'에서 'char *'(으)로 변환할 수 없습니다.

1>          정수 계열 형식에서 포인터 형식으로 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.


컴파일 성공한 부분이 정수를 char* 타입으로 재해석 한 reinterpret_cast의 기본동작이다. 



[예제 2]


아무런 관계가 없는 class 객체의 포인터 간에 reinterpret_cast가 성공하는 것을 볼 수 있다.

하지만, 위에서도 언급했듯 런타임 에러는 사전에 발견할 수 없다. 

pAnimal->State(); 를 하면 Flower State가 출력된다.

이에 따라 pAnimal이 reinterpret_cast를 통해 Flower class 의 객체가 된 것을 알 수 있다.



[예제 3]



error C2440: 'reinterpret_cast' : 'const char *'에서 'char *'(으)로 변환할 수 없습니다.

1>          변환하면서 한정자가 손실됩니다.


reinterpret_cast 가 const_cast처럼 상수성을 없애주진 않는다.





[참고] http://prostars.net/65


'예전 > C, C++' 카테고리의 다른 글

[C++] static 멤버 변수, 함수  (0) 2014.01.28
[C] memmove와 memcopy  (0) 2013.08.24
[C++] dynamic_cast  (0) 2013.08.21
[C++] const_cast  (0) 2013.08.21
[C++] static_cast  (0) 2013.08.21