C스타일 캐스트를 쓰면 안되는 이유
1. 다른 타입으로 생각없이 바꾸어 줌
constness 캐스트와 다운캐스트는 완전 다른데 신경쓰지 않고 바꾸어 버립니다
2. 눈이나 프로그램으로 식별하기 어려움
//C스타일 캐스트
double result = ((double)Number)/OtherNumber;
//C++스타일 캐스트
double result = static_cast<double>(Number/OtherNumber);
C++의 새로운 캐스트 사총사
1. static_cast
2. const_cast
3. dynamic_cast
4. reinterpret_cast
1. static_cast
- C스타일 캐스트와 똑같은 의미와 형변환 능력을 지님
- C스타일과 받는 제약도 같음
ex) struct 를 int로 형변환
- 상수성을 떼어내지도 못함
2. const_cast
- const나 volatileness 없애기 위해
- 다른 용도의 캐스팅은 하지 못함
ex) 다운캐스팅 시 에러
3. dynamic_cast
- 상속관계를 가로지르거나 하향시킨 클래스 타입으로 "안전하게 캐스팅"
- 어떤 객체가 차지하고 있는 메모리의 시작 부분을 찾는 데에도 쓰임
- 캐스팅 실패 시 확인하는 법
포인터 : nullptr
참조자 : 예외
- 제약
(1) 상속 계층 구조를 오갈 때만 사용
(2) 가상 함수가 없는 타입에는 사용 불가능.
(3) 상수성 제거에도 쓸 수 없음
4. reinterpret_cast
- 변환결과가 컴파일러에 따라 다름 (코드 이식 불가능)
- 가장 흔한 용도 : 함수 포인터 타입 서로 바꾸기
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething(); //FuncPtr과 리턴 타입 일치하지 않음
funcPtrArray[0] = &doSomething; // 에러! 타입 불일치
funcPtrArray[0] = reinterpret_cast(&doSomething); //컴파일가능
* 함수포인터의 캐스팅은 소스의 이식성을 떨어뜨리고 잘못된 결과를 낳기도 하기 때문에(항목 31) 정말 좋지 않음