Programming Language/C, C++

Cast - reinterpret_cast, static_cast, const_cast, dynamic_cast

MOLOKINI 2014. 5. 13. 22:55

캐스트 : 형변환
C++스타일의 캐스트는 reinterpret_cast, static_cast, const_cast, dynamic_cast 등이 있다.
 
쉽게 말해 C 스타일의 캐스트는 식별자를 그냥 괄호로 둘러 싼 그것
float a = 1.23;
int b = (int)a;
이게 바로 C스타일의 캐스트, 즉 형변환
이렇게 써놓으면 눈으로 찾기도 힘들고 내부적으로도 코드가 더러워지는 등 불편함이 있다고 합니다.
 
그런데 C++스타일의 캐스트는
static_cast<타입>(표현식)
이런식으로 작성됩니다.
 
예를들면,
int형을 double형인것 처럼 결과를 내고싶다면 C스타일로는
int a, b;
double result = ((double) a) / b;
요런식이겠지요
 
그런데 C++스타일의 캐스트를 적용하면
double result = static_cast<double>(a) / b;
이런 스타일로 적용됩니다.
이러면 가독성이 높아집니다, 왜냐하면, static_cast 부분은 파란색으로 나오기 때문입니다,
가독성 외에도 컴파일러에서도 저 부분이 인식이 더 잘된다고 합니다.
 
static_cast
기본적으로 C스타일의 캐스트와 같은 역할
그래서 double을 포인터로 바꾼다던지 int를 struct로 바꾼다던지 하는 일은 하지 못합니다.
 
const_cast
이것은 상수성(const)이나 휘발성(volatile)을 떼버리는데 사용되는 캐스트입니다.
const로 선언된 것을 제거하는데 쓰입니다
예를들면,
int update(int *a);
int b;
const & cb = b;  // cb는 b를 상수객체 인것처럼 참조합니다
update(&cb);     // 에라!! 상수라서 안돼
update(const_cast<int*>(&cb));   // 상수성을 제거해서 되는거야

dynamic_cast
얘는 상속계층 관계를 가로지르거나, 하향시킨 클래스 타입으로 안전하게 캐스팅 할 때 사용
기본 클래스의 객체에 대한 포인터나 참조자의 타입을 파생클래스나 형제클래스 타입으로 형 변환해주는 것
걍 예제를 보아요
class Widget {.....};                                    // 위젯 클래스
class SpecialWidget : public Widget {.....};    // 위젯의 하위클래스
void update(SpecialWidget *psw)
Widget *pw;
update(dynamic_cast<SpecialWidget*>(pw));  // 이상 없음 하위클래스의 형태로 형변환

당연한 얘기지만 dynamic_cast는 상수성을 제거하는데에는 사용될 수 없습니다
 
reinterpret_cast
얘가 정의되어 있는 코드는 컴파일러에 따라 다르게 정의되어 있기 때문에 왠만하면 쓰지 않는 편이 좋겠습니다.
함수 포인터 타입을 바꾸는데 사용되는데, 
예를들면,
typedef void (*FuncPtr)();  // 인자 안받고, void를 반환하는 함수에 대한 포인터
FuncPtr funcPtrArray[10];  // funcPtrArray는 10개의 FuncPtr로 이루어진 배열
이런 상횡에서 어쩔 수 없이 다음 함수에 대한 포인터를 넣어야할 사정이 생겼어요
int doSomething();
간단한 문제같지만 캐스트를 반드시 해 주어야 합니다.
왜냐, doSomething()은 funcPtrArray에 넣기엔 타입이 맞지 않아요
funcPtrArray는 void를 리턴하구 doSomething은 int를 리턴하니까요
funcPtrArray[0] = &doSomething;    // 걍에러 타입이 안맞습니다
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);   // 됩니다.

  
캐스트를 알아보았는데,
되도록이면 안쓰는걸 추천합니다
잘못된 결과가 나오기도하고, 이식성에도 좋지 않기 때문입니다.

'Programming Language > C, C++' 카테고리의 다른 글

디버깅용 __LINE__, __FILE__ 등등  (0) 2014.05.13
반올림 매크로 - C++  (0) 2014.05.13
LPCTSTR, TCHAR, char  (0) 2014.05.13
struct, typedef  (0) 2014.05.13
C++ TR1 설치  (0) 2014.05.13