[C++] casting

CS/C/C++ 2009. 1. 19. 08:09
[ static_cast ] 
static_cast는 암시적으로 수행될 수 있는(역변환을 포함하여) 캐스팅을 수행할 수 있도록 한다.
 
double d = 3.14159265;
int i = static_cast<int>(d);
클래스에 대한 포인터 관점에서 static_cast는 상속된 클래스에서 기초 클래스로(암시적으로 수행되는 vaild conversion) 혹은 그 반대(기초 클래스에서 상속된 클래스)로의 캐스팅을 해 준다.
  
class Base {};
class Derived : public Base {};

Base *a = new Base;
Derived *b = static_cast<Derived *>(a);


[ dynamic_cast ] 
체크는 런타임시에 수행되며, 만약 변환된 포인터가 요청된 type의 유효한 객체에 대한 포인터가 아니라면 NULL 포인터를 리턴한다. (참조자였다면 bad_cast 예외를 던진다.) 

(다운 캐스팅 예)
class Base { virtual dummy() {} };
class Derived : public Base {};

Base* b1 = new Derived;
Base* b2 = new Base;

Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns 'NULL'
(크로스 캐스팅 예)
class BaseOne { virtual dummy() {} };
class BaseTwo { virtual dummy() {} };
class Derived : public BaseOne, public BaseTwo
{
void dummy() {}
};

BaseOne* pBaseOne = NULL;
BaseTwo* pBaseTwo = new Derived;

pBaseOne = pBaseTwo; // error : 타입 변환을 할 수 없다.
pBaseOne = dynamic_cast<BaseOne*>( pBaseTwo ); // success


[ reinterpret_cast ] 
서로 관계가 없는 type간의 변환을 수행한다.
class A {};
class B {};

A * a = new A;
B * b = reinterpret_cast<B *>(a);


[ const_cast ] 
포인터 혹은 참조형의 상수성을 제거하는데 사용
class C {};

const C *a = new C;
C *b = const_cast<C *>(a);


[참조]
http://www.codeguru.com/forum/showthread.php?t=312456 
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=146
: