본문 바로가기

책/MoreEffectiveC++

항목2. 가능한 C++ 캐스트를 즐겨쓰자

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) 정말 좋지 않음