03
18

C 스타일의 캐스팅은 (type-id)(e-pression) 문법이다.

C++스타일은 캐스팅은 <type-id>(e-pression) 문법

 

const 객체에 대한 포인터를 non-const객체에 대한 포인터로

바꾸는 캐스트와 기본 클래스와 파생 클래스로 바꿔주는 캐스트는

동작 자체가 굉장히 다르기 때문에, (C는 무지성 캐스팅을 함)

C++ 스타일 캐스팅으로 명확하게 해서, 세부사항을 고려할 수 있다. 

 

->C 스타일은 어떤 타입이든 다른 타입으로 바꿔준다.

->C++스타일은 명확하게 캐스팅이 가능하다. 

->static_cast, const_cast, dynamic_cast, reinterpret_cast

 

1. const_cast

const_cast는 상수 성을 없애고 부여하는 데 사용한다.

const int a = 0;
int b = const_cast<int&>(a);

상수 성을 제거해서 받았다.

 

2. reinterpret_cast

포인터 타입 -> 포인터 타입

int* -> char*, Aclass* -> Unrelated_Class*

비트단위로 재해석하면서 모든 포인터 타입을

강제 형변환 하기 때문에 특정 목적이나 관계가 명확할 때

쓰는 것이 바람직하다. (주소가 유효한지 검사 안 한다.)

 

변환 결과가 컴파일러에 따라 다르게 정의돼있어,

다른 곳에 소스 이식하기 불편함.

 

3. static_cast

기본적인 캐스트 연산자이다.

우리가 일반적으로 생각하기에 구조체를 int나 double 형태로 형 변환하지 못하고

float타입을 포인터 타입으로 변환하지 못하는 그 캐스팅 연산자이다. 

이름이 static인 이유는 컴파일 단계에서 형변환 타입 체크를 하기 때문이다.

dynamic_cast은 런타임에 타입체크를 한다. 

 

4. dynamic_cast

동적으로 다운 캐스팅 시에 사용하는 캐스팅 연산자이다.

기본 클래스 객체에 대한 포인터나 참조자를

파생 클래스, 형제 클래스 타입으로 변환해준다.

런타임에 다형성을 사용해 애매한 타입 캐스팅을 시도할 때

엉뚱한 결과가 넘어가지 않게 런타임 오류를 방지한다.  

캐스팅 실패는 NULL, 예외(참조자)를 보고 판별 가능.

 

5. static_cast VS dynamic_cast

정적 형 변환, 동적형 변환으로서 앞에서 얘기했듯,

컴파일 단계에서 검사하느냐, 런타임에서 검사하느냐의 차이이다.

 

변환 대상 타입이 바뀔 일이 없고 명확하다면 static을 쓰고, 

변환 대상이 애매모호하다면 dynamic_cast를 사용하는 것이 좋다.

 

http://egloos.zum.com/sweeper/v/1907485

 

[C++] static_cast, dynamic_cast, const_cast, reinterpret_cast

아래 내용은 MEC++ 2장을 토대로 개인 견해와 예제 코드를 곁들여 작성되었다. -------------------------------------------------------------------------------- 1. C 스타일 캐스트와 C++ 캐스트 간략 소개 캐스트(cast,

egloos.zum.com

 

COMMENT