[컴][c++] c++ 의 cast 4개 간단 정리



upcast / downcast

  • upcast : 이것은 흔히 우리가 알고 있는 type cast 이다. 그러니까 child class 에서 parent class 로의 type cast 이다. 
  • downcast : 이것은 이름에서도 알 수 있듯이 up cast 의 반대이다. 그러니까 parent class 인 녀석을 child class 로 변환하는 것이다.

c++ 에서 제공하는 cast 연산자 4개

dynamic_cast


  • dynamic_cast : downcast 에 쓰인다. (상속 관계에 있는 type 끼리의 cast 에 쓰인다.)

dynamic_cast<type_id>(expression)

상속관계에 있는 type 을 cast 할 때 쓰인다.

expression 가 type_id의 base class 라면, expression 이 실제로 type-id 의 object 인지를 run-time 에 check 를 하게 된다. 그래서 실제로 expression 이 type-id 의 object 라면, cast 를 해준다.

아래 예로 설명을 하면, 'pa' 가 실제로 class B type 인지를 확인하고, 'pa' 가 실제로 class B type 이라면 class B type 으로 변경해준다. 하지만 그렇지 않다면, 변경하지 않는다.

class A
...

class B: public A // extends A
...

class C: public B // extends B
...

A* pa = new B;   // unclear but ok  
A* pa2 = new A;  

B* pb = dynamic_cast<B*>(pa);   // ok: pb actually points to a B  
B* pb2 = dynamic_cast<B*>(pa2);   // pb2 points to a A not a B



reinterpret_cast

이 녀석은 pointer 의 type 변환에 쓰인다. const 형식의 type 을 다른 type 으로 변경하는 것만 빼고는 다된다.

  • 안되는 cast : const type --> other type


const_cast

  • const type --> non-const type(volatile)
  • non-const type --> const type

static_cast

대부분의 cast 를 행한다. 다만

  • pointer 의 type 변환은 reinterpret_cast 가 한다. (void* 는 static_cast 로 가능하다)
  • 그리고 const 속성은 const_cast 가 한다.
  • 그러니 이것 빼고 대부분은 이것을 사용하면 된다.

그리고 추가적으로 static_cast 는 void* 으로의 cast 는 자유롭다. 그래서 void* 를 통해서 새로운 pointer type 으로 변경해서 reinterpret_cast 와 같은 기능을 할 수도 있다.



References


  1. dynamic_cast Operator
  2. I'm Prostars :: C++ 이야기 - [1] 캐스트 연산자 const_cast
  3. I'm Prostars :: C++ 이야기 - [2] 캐스트 연산자 dynamic_cast
  4. I'm Prostars :: C++ 이야기 - [3] 캐스트 연산자 static_cast
  5. I'm Prostars :: C++ 이야기 - [4] 캐스트 연산자 reinterpret_cast







댓글 없음:

댓글 쓰기