C언어에서는 캐스팅을 다음과 같이 하였습니다.
(타입) 표현식
C++에서는 다음과 같은 형식을 사용하도록 유도하고 있습니다.
static_cast<타입> (표현식)
한가지 예를 들어 봅시다.
int num1 = 2101, num2 = 104;
double result = ((double)num1)/num2; // C언어 스타일 캐스팅.
double result = static_case<double>(num1)/num2 // C++ 스타일 캐스팅.
double result = ((double)num1)/num2; // C언어 스타일 캐스팅.
double result = static_case<double>(num1)/num2 // C++ 스타일 캐스팅.
코드로 작성하기에는 좀 더 불편해졌지만 한눈에 보더라도 캐스팅하고 있음을 알 수 있도록 변경되었습니다. 솔직히 C언어 스타일의 캐스팅은 캐스팅하고 있는건지 코드를 보면서 한눈에 들어오지는 않았습니다.
하지만 C++ 스타일의 캐스팅은 총 4가지가 있습니다. 각각에 대해서 간단하게 알아보도록 하겠습니다. 사용법은 4가지 모두 동일합니다.
# static_cast : C언어 스타일의 캐스팅과 같은 기본적인 형변환 연산자입니다.
# const_cast : 표현식의 상수성이나 휘발성(volatileness)을 없애는 용도로만 사용됩니다.
# dynamic_cast : 상속 계층 구조를 변환하는 용도로만 사용됩니다.
# reinterpret_cast : 포인터 타입을 바꾸는 용도로만 사용됩니다.
기타 다른 캐스팅의 자세한 사용법은 나중에 알아보기로 하고 마지막 reinterpret_cast에 대해서만 좀 더 알아보겠습니다.
하지만 C++ 스타일의 캐스팅은 총 4가지가 있습니다. 각각에 대해서 간단하게 알아보도록 하겠습니다. 사용법은 4가지 모두 동일합니다.
# static_cast : C언어 스타일의 캐스팅과 같은 기본적인 형변환 연산자입니다.
# const_cast : 표현식의 상수성이나 휘발성(volatileness)을 없애는 용도로만 사용됩니다.
# dynamic_cast : 상속 계층 구조를 변환하는 용도로만 사용됩니다.
# reinterpret_cast : 포인터 타입을 바꾸는 용도로만 사용됩니다.
기타 다른 캐스팅의 자세한 사용법은 나중에 알아보기로 하고 마지막 reinterpret_cast에 대해서만 좀 더 알아보겠습니다.
typedef void (*FunctionPointer)(); // 인자와 반환값이 모두 없는 함수 포인터.
int DisplayGame(); // 일반함수.
FunctionPointer Display; // 함수포인터를 입력받을 변수.
Display = &DisplayGame; // 에러. 타입 불일치.
Display = reinterpret_cast<FuctionPointer>(&DisplayGame); // 통과.
int DisplayGame(); // 일반함수.
FunctionPointer Display; // 함수포인터를 입력받을 변수.
Display = &DisplayGame; // 에러. 타입 불일치.
Display = reinterpret_cast<FuctionPointer>(&DisplayGame); // 통과.
위와 같이 포인터의 타입을 바꾸는데 reinterpret_cast를 사용할 수 있습니다.