티스토리 뷰
Language/C C++
[C++] dynamic_cast, const_cast, reinterpret_cast, static_cast
jhbaek 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
'Language > C C++' 카테고리의 다른 글
[C++] Double Pointer에 관하여. 동적 배열에 관하여. (1) | 2011.03.17 |
---|---|
[C++] class를 주고 받을땐 레퍼런스를 사용하자. (0) | 2011.01.28 |
[C++] 분기문을 싫어하는 나같은 사람에겐.. (0) | 2010.11.30 |
[C++] RTTI와 vtable 그리고 RTCI (0) | 2010.11.25 |
[C++] 멤버 변수에서 생성자를 가진 변수 만들기 (0) | 2010.10.06 |
[C++] Algorithm 헤더를 이용한 정렬 (0) | 2010.09.07 |
C++ Vector와 List의 사용 (0) | 2010.09.07 |
UAC 내에서 한시적으로 Admin권한 상승 시키기 (0) | 2010.07.08 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- NDK
- Python
- C
- jni강좌
- db
- kering
- 리눅스
- 프로그래밍
- Troubleshooting
- it
- 안드로이드
- C++
- 음악
- AWS
- source
- gcc
- MFC
- Visual C++
- Quiz
- database
- API
- android
- java
- linux
- 드라이버
- jni
- winapi
- driver
- algorithm
- Cloud
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함