시작은 미미하나 끝은 쥬쥬하리라.

Study/Passionate C++ Programming

[열혈 C++ 프로그래밍] (16) C++ 형 변환자

코딩뚜벅이 2024. 2. 10. 18:19

C언어 기반 C++ 2

  • 형 변환 연산1
  • 형 변환 연산2
  • 형 변환 연산3

형 변환 연산1

C++ 형 변환

다운 캐스팅 등 문법적으로 에러가 있더라도 컴파일 에러를 일으키지 않고 형 변환 연산 처리
C++의 형 변환 : 4가지의 종류로 분할하여 사용
-> 각 종류 별 케이스에 일치하지 않으면 컴파일 에러 발생, 문법적 오류 발견 가능
1. static_cast 2. const_cast 3. dynamic_cast 4. reinterpret_cast
dynamic_cast(안전성 보장) <-> static_cast(안전성 미 보장)

 


 

형 변환 연산2

dynamic_cast

포인터 또는 참조자를 T형으로 변환하되, 안전한 형 변환만을 허용


ex) B클래스의 기초 클래스 A클래스일 때, B클래스의 포인터를 A클래스의 포인터로 변환하는 것은 안전
: B클래스의 포인터로 가리키는 것은 A클래스의 포인터로도 항상 가리킬 수 있기 때문
<-> A클래스의 포인터로 가리키는 것을 B클래스의 포인터형으로 변환하는 것은 불안전
: 유도클래스의 포인터를 기초 클래스 포인터형으로 변환하는 것은 안전 : dynamic_cast
+ 상속 관계에 있는 포인터 간 형 변환

 


static_cast
프로그래머가 일정 부분 책임을 감수하고

 

 

static_cast

프로그래머가 일정 부분 책임을 감수하고 넓은 범위에서 형 변환을 허용
-> 기초 클래스의 포인터를 유도 클래스의 포인터형으로 변환하는 것을 무조건 허용
+ 기본 자료형 간 형 변환
+ static_cast는 const를 제거 할 수 없음 (C의 형 변환은 const 제거 가능)

 

 

const_cast

const 성향을 제거하는 형 변환

 

const char* name = "john";
ShowString(const_cast<char*>(name));


-> const char*형을 char*형으로 캐스팅

 

 

reinterpret_cast

상관없는 자료형으로의 형 변환
-> 서로 아무 관련이 없고 상속 관계에 있는 것도 아닌 클래스 간의 형 변환
-> 형 변환의 결과는 예측 할 수 없음

 

 


 

형 변환 연산3

polymorphic 클래스

멤버 중 하나 이상이 가상으로 선언되어 있는 클래스
- 기본적으로 dynamic_cast에서 유도 클래스에서 기초 클래스로의 형 변환은 불허
-> 기초 클래스가 폴리몰픽 클래스라면 dynamic_cast도 유도 클래스에서 기초 클래스로의
포인터 및 참조형 변환은 허용

 

bad cast

참조형을 대상으로 dynamic_cast하는 경우 bad_cast 발생 가능성 : 예외 처리가 필요