C언어의 제제가 없는 캐스팅을 한 차원 높여 C++에서는 몇 가지 캐스팅 예약어를 만들었다고 한다.
C언어의 구형 스타일 캐스팅보다 훨씬 알아보기 쉽기 때문에 소스 코드 어디에서 C++의 타입 시스템이 망가졌는지를 찾아보는 작업이 편해지고, 캐스트를 사용한 목적을 더 좁혀서 지정하기 때문에
컴파일러 쪽에서 사용 에러를 진단 할 수 있다는 장점이 있다.
1. static_cast : C언어의 캐스팅과 동일한 역할을 한다.
암시적 변환(비상수 객체 → 상수 객체, int → double)을 강제로
진행할 때 사용된다. 흔히들 이루어지는 타입 변환을 거꾸로 수행하는
용도로도 쓰인다. (void* → 일반 타입의 포인터, 기본 클래스 포인터
→ 파생 클래스의 포인터). 하지만 상수 객체를 비상수 객체로 캐스팅
하는데에는 사용할 수 없다.
char ch = 'A'; int x = static_cast<int>(ch); |
#include <iostream> using namespace std; void show(int *p) { cout << *p << endl; } int main() { int x = 10; const int &ref = x; show(const_cast<int *>(&ref)); return 0; } |
3. dynamic_cast : 상속 계층 구조에서 사용, 가상 함수가 없는 타입에는 적용 불가!!!
이른바 '안전한 다운 캐스팅'을 할 때 사용하는 연산자.
즉, 주어진 객체가 어떤 클래스 상속 계통에 속한 특정 타입인지
아닌지를 결정하는 작업에 쓰인다. 덤으로 런타임 비용이 높은
캐스트 연산자로도 유일하다.
class CCar { public: virtual void show() { cout << "car~" << endl; } private: }; class CSuperCar : public CCar { public: virtual void show() { cout << "the most superior!" << endl; } private: }; class CComputer { public: private: }; int main() { CCar *a = new CSuperCar(); CSuperCar *b = dynamic_cast<CSuperCar *>(a); CComputer *c = dynamic_cast<CComputer *>(a); cout << c << endl; return 0; } |
캐스팅 불가능하면, NULL값을 대입한다.
4. reinterpret_cast : 포인터와 포인터 간의 변환
포인터를 int로 바꾸는 등의 하부 수준 캐스팅을 위해 만들어진
연산자. 이것의 적용 결과는 구현 환경에 의존적이다.
이런 캐스트는 하부 수준 코드외에는 거의 없어야 한다.
#include <iostream> using namespace std; int main() { unsigned char *buffer = new unsigned char[4]; buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; int *p = reinterpret_cast<int *>(buffer); cout << *p << endl; return 0; } |
'IT_Programming > C · C++' 카테고리의 다른 글
Closure in C++ (0) | 2011.05.12 |
---|---|
[펌] C/C++ volatile에 대한 오해 (0) | 2010.10.20 |
[C++] assert (0) | 2009.11.12 |
[C] C언어에서 inline assembly 사용하기 (0) | 2009.10.07 |
[펌] MySQL 최적화 c api 소스 (0) | 2009.09.16 |