JHB의 프로그래밍 삽질기

[C++] dynamic_cast, const_cast, reinterpret_cast, static_cast 본문

PROGRAMMING/C C++ MFC

[C++] dynamic_cast, const_cast, reinterpret_cast, static_cast

roter 2010.11.24 11:07
dynamic_cast
const_cast
reinterpret_cast
static_cast


A가 B의 superclass일 때
A* a; B* b = new B();
a = (A *)b; 이거는 dynamic_cast<A *>(b);와 같음
dynamic_cast는 safe함. 
서브->슈퍼 캐스팅은 상관 없지만
슈퍼->서브 캐스팅은, C style로 캐스팅하면 캐스팅이 되긴 하지만, 참조 할 수 없는 멤버를 참조 하려 하면 런타임 에러가 발생함.
dynamic_cast를 이용하면 서브->슈퍼 일때만 캐스팅 하고 아닐 대는 null을 참조함. 따라서 null 체크를 통해 런타임 에러를 방지할 수 있다. 
덧, 포인터로 선언한 클래스 일때만 된다.
Parent *p1 = new Child;
Parent *p2 = new Parent;

Child *c1 = dynamic_cast<Child*>(p1);
Child *c2 = dynamic_cast<Child*>(p2);
if(c2 == NULL){
printf("err\n");
}
try{
c2 = dynamic_cast<Child*>(p2);
catch(bad_cast& e){
printf("err\n");
}


static_cast는 C에서의 캐스팅이랑 동일하다고 생각하면 된다.

const_cast는 임시로 const를 제거하는 캐스팅. 당연히 사용 권장하지 않음.
const int value = 1;
int i = const_cast<int>(value);

reinterpret_cast는 조건 안따지고 무조건 캐스팅. 비트열 그대로 캐스팅한다. 당연히 안쓰는게 좋다.
포인터를 정수형으로 변환하는 작업에는 쓰일 수 있겠지만 사용하기는 비추.
int i=0,j=0;
i = reinterpret_cast<int>(&j);

정리하면
dynamic_cast는 부모 자식 클래스간에 캐스팅 해줄 때 사용.
static_cast는 걍 캐스팅 할 때 사용.
나머지는 별로..



p.s>번외로.. 
dynamic_cast에서 사용한 bad_cast같은 try{} catch{} exception 은 사용하지 않는게 좋다..
구글느님의 c++ style guid를 보면 "We do not use C++ exceptions"라고 써 있다.
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Exceptions#Exceptions
Tag
,
2 Comments
댓글쓰기 폼