예전/C, C++

[C++] static_cast

showmiso 2013. 8. 21. 20:50


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 를 추천한다.





[참고] http://prostars.net/64