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 이 되도록 한다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기