2015년 9월 23일 수요일

[C++] Type casting


1. static_cast : 이성적인 형 변환을 지원하는 연산자
포인터를 사용하여 변환을 수행할 경우, 일단 static_cast 를 먼저 사용하는 것이 바람직하다.


위 코드가 c로 컴파일 하면 error 발생하지 않고
cpp로 컴파일하면 error가 발생하는 이유는 무엇일까?

malloc() 함수로 반환되는 void* type 을 char*로 casting 하는 것은 사실 C언어에서도 허용되선 안되는 코드이다.
C언어 컴파일러는 개발자의 코드를 100%신뢰하는 것을 전제로 개발되었기에 컴파일 타임 에러를 발생시키진 않는다.
하지만 C++ 는 형변환을 strict 하게 처리한다.
그러므로 개발자가 명시적 형변환을 해야 한다.

하지만, 명시적 형변환은 컴파일러가 무조건 허락해주는데 문제점이 있다.
그러므로, static casting 을 사용해서 위의 문제점을 예방한다.


static_cast 는 이성적인 형 변환만을 진행한다.
malloc 으로 반환되는 void* 는 그 자체로 연산이 불가능하므로,
char* 로의 형 변환은 이성적이라 말할 수 있다.


2. reinterpret_cast : 비이성적인 형변환을 하려는 경우 사용한다.
C언어의 대부분의 형 변환을 지원한다. (마치 C언어의 명시적 형변환 같이 동작한다.)

double 값을 int*로 casting 하듯 down casting이 필요한 경우가 발생한다.
예를 들어, big endian 과 little endian 을 검사하는 경우

c 를 출력할 때 1이 출력되면 little endian으로 볼 수 있다.

하지만 컴파일러는 이성적인 형 변환이 아니기 때문에 에러를 반환한다.
위와 같이 비이성적인 형 변환을 위해서는 reinterpret_cast 를 사용해야 한다.




3. const_cast : 상수 객체를 비상수 객체로 변환할때 사용한다.
const_cast 를 사용했다는 것은 대부분 설계가 잘못되었을 가능성이 높다.


4. dynamic_cast : 안전하게 pointer 와 reference 를 상속관계에 있는 class로 up, down, side casting 을 지원한다.

Reference : dynamic_cast from cpp reference

위 예제서도 볼 수 있듯이 dynamic_cast는 이성적으로 down casting 이 되는 것만 casting 이 되도록 한다.








댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...