Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 16. C++ 형 변환 연산자와 맺는 글

Similar presentations


Presentation on theme: "Chapter 16. C++ 형 변환 연산자와 맺는 글"— Presentation transcript:

1 Chapter 16. C++ 형 변환 연산자와 맺는 글
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 16. C++ 형 변환 연산자와 맺는 글

2 윤성우의 열혈 C++ 프로그래밍 Chapter 16-1. C++에서의 형 변환 연산

3 모기를 잡으려면 모기약을 써야지~ 윤성우의 열혈 C++ 프로그래밍
static_cast, const_cast, dynamic_cast, reinterpret_cast 문제는 없으나 의도한 바인지 아닌지 알 수 없는 코드 프로그래머의 실수가 분명함! 그러나 컴파일러는 에러를 일으키지 않는다.

4 dynamic_cast: 상속관계에서의 안전한 형 변환
윤성우의 열혈 C++ 프로그래밍 dynamic_cast<T>(expr) 포인터 또는 참조자인 expr을 T 형으로 변환하되 안전한 형 변환만 허용을 한다. 여기서 말하는 안전한 형 변환이란, 유도 클래스의 포인터 및 참조자를 기초 클래스의 포인터 및 참조자로 형 변환하는 것을 의미한다. 의도한 바 일수 있다. 그리고 이러한 경우에는 staic_cast 형 변환 연산자를 사용해야 한다.

5 static_cast: A 타입에서 B 타입으로
윤성우의 열혈 C++ 프로그래밍 static_cast<T>(expr) 포인터 또는 참조자인 expr을 무조건 T형으로 변환하여 준다. 단! 형 변환에 따른 책임은 프로그래머가 져야 한다. static_cast 연산자는 dynamic_cast 연산자와 달리, 보다 많은 형 변환을 허용한다. 하지만 그에 따른 책임도 프로그래머가 져야 하기 때문에 신중히 선택해야 한다. dynamic_cast 연산자를 사용할 수 있는 경우에는 dynamic_cast 연산자를 사용해서 안전성을 높여야 하며, 그 이외의 경우에는 정말 책임질 수 있는 상황에서만 제한적으로 static_cast 연산자를 사용해야 합니다

6 static_cast: 기본 자료형 간 변환
윤성우의 열혈 C++ 프로그래밍 int main(void) { int num1=20, num2=3; double result=20/3; cout<<result<<endl; } C 스타일 형 변환 double result=(double)20/3; double result=double(20)/3; C++ 스타일 형 변환 double result=static_cast<double>(20)/3; static_cast는 기본 자료형간 형 변환도 허용한다. int main(void) { const int num=20; int * ptr=(int*)&num; *ptr=30; cout<<*ptr<<endl; float * adr=(float*)ptr; cout<<*adr<<endl; } static_cast 연산자는 ‘기본 자료형 간의 형 변환’과 ‘클래스의 상속관계에서의 형 변환’만 허용! C언어의 형 변환 연산자는 왼편에서와 같은 경우에도(모든 경우에) 형 변환을 허용. 따라서 제한적으로 허용하는 static_cast 연산자가 훨씬 안정적이다. const 제거! 상속과 관계 없는 포인터 형으로의 형 변환

7 const_cast: const의 성향을 제거하라!
윤성우의 열혈 C++ 프로그래밍 const_cast<T>(expr) expr에서 const의 성향을 제거한 T형 데이터로 형 변환하라!

8 reinterpret_cast: 상관없는 자료형으로의 형 변환
윤성우의 열혈 C++ 프로그래밍 서로 아무런 관련이 없는 두 클래스 reinterpret_cast<T>(expr) expr을 T 형으로 형 변환하는데 expr의 자료형과 T는 아무런 상관관계를 갖지 않는다. 형 변환의 결과는 예측하지 못한다. reinterpret_cast 형 변환 연산자의 적절한 사용의 예 바이트 별 정수의 크기 출력하기 실행결과

9 dynamic_cast 두 번째 이야기: Polymorphic 클래스
윤성우의 열혈 C++ 프로그래밍 형 변환 연산의 기본규칙 아래의 예에서 보이듯이 기초 클래스가 Polymorphic 클래스라면 유도 클래스로의 포인터 및 참조형으로의 형 변환은 허용이 된다!

10 dynamic_cast와 static_cast의 차이
윤성우의 열혈 C++ 프로그래밍 기초 클래스가 Polymorphic 클래스라면 유도 클래스의 포인터 및 참조형으로의 형 변환에는 dynamic_cast 연산자와 static_cast 연산자 모두 사용할 수 있다. 하지만 여전히 dynamic_cast 연산자는 안전성을 보장한다. 반면 static_cast 연산자는 안전성을 보장하지 않는다. 형 변환 OK! 형 변환 실패! NULL 반환 dynamic_cast 연산자는 위의 형 변환을 허용하지 않는다. 반면 static_cast 연산자는 허용을 한다. 물론 그 결과는 보장받지 못한다.

11 bad_cast 예외 윤성우의 열혈 C++ 프로그래밍 실행결과
참조자 ref가 실제 참조하는 대상이 SoSimple 객체이기 때문에 SoComplex 참조형으로의 형 변환은 안전하지 못하다. 그리고 참조자를 대상으로는 NULL을 반환할 수 없기 때문에 이러한 상황에서는 bad_cast 예외가 발생한다.

12 윤성우의 열혈 C++ 프로그래밍 Chapter 맺는 글 윤성우 저 열혈강의 C++ 프로그래밍 개정판

13 Chapter 16이 끝났습니다. 그 동안 수고 많으셨습니다.


Download ppt "Chapter 16. C++ 형 변환 연산자와 맺는 글"

Similar presentations


Ads by Google