[C++] static_cast
static_cast는 C 언어의 casting 처럼 만능은 아니지만, 여러 용도가 있다.
1. float-int, int-열거형 등 기본 데이터 타입간의 변환
int i; double d; i = static_cast<int>(d); |
2. 상속관계의 클래스 계층 간의 변환
3. void*를 다른 타입의 포인터로 변환
(참고) void*는 흔히 주소를 저장하는 용도로 쓰인다. int i = 400; void* pv = &i; int* pi = (int*)pv; |
4. 서로 다른 타입의 포인터 사이에 타입 변환은 할 수 없다.
서로 다른 타입의 형변환의 경우 reinterpret_cast를 사용하는 것보다는 void*를 사용해 경유하는 방식을 추천한다.
[예제 1]
warning C4244: '=' : 'double'에서 'int'(으)로 변환하면서 데이터가 손실될 수 있습니다.
위는 static_cast 의 기본적인 예제이다.
[예제 2]
error C2440: 'static_cast' : 'int *'에서 'char *'(으)로 변환할 수 없습니다.
1> 가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.
[예제 3]
error C2440: 'static_cast' : 'B *'에서 'A *'(으)로 변환할 수 없습니다.
1> 가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.
변환하려는 포인터가 계층 관계에 있다면 casting 가능하다.
pB 가 NULL 이여도 컴파일엔 성공한다. 다만, 문제는 런타임에서 발생할 것이다.
이러한 문제 때문에 클래스 계층간의 타입 변환은 dynamic_cast 를 추천한다.