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
'STUDY > C++' 카테고리의 다른 글
C++ - 자동으로 컴파일러가 만들어주는 복사생성자, 복사 대입 연산자 사용 방지법 (0) | 2022.07.28 |
---|---|
C++ - 가변 인자 템플릿 (Variadic Template) (0) | 2022.03.21 |
C++ - Template 템플릿, 동작과정, typename과 class 선언의 차이 (0) | 2022.03.16 |
C++ std::function / std::bind / std::placeholders 사용법 (0) | 2022.01.21 |
숫자0~9까지 아스키코드값은 48~57 영문a~z까지의 아스키코드값은대문자 65~90소문자 97~122 (0) | 2021.11.01 |