ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++
    프로그래밍 언어/expression 2009. 1. 3. 15:32
    reinterpret_cast<>()
    임의의 데이터 형식을 전혀 다른 임의의 데이터 형식으로 바꾼다.

    HTREEITEM hRoot = reinterpret_cast<HTREEITEM>(m_ctlSysTreeView32.SendMessage(TVM_INSERTITEM ,
            0, reinterpret_cast<LPARAM>(&TreeCtrlItem)));
    /*
    or
    HTREEITEM hRoot = (HTREEITEM)(m_ctlSysTreeView32.SendMessage(TVM_INSERTITEM ,
            0, (LPARAM)(LPTVINSERTSTRUCT)(&TreeCtrlItem)));

    */

    static_cast<>()
    런타임시에 발생할 수 있는 오류를 컴파일 타임에 잡아내 줄수 있다.
    c type의 cast는 버그의 가능성을 만들어 주지만 static_cast는 안전하게 casting 해주거나 컴파일 타임에 오류를 낸다.
    문법상 형변한이 가능하다면(C++의 문법) 그냥 형을 변환시킨다.
    dynamic_cast<>() 보다 더 빠른 장점이 있지만, 위험한 단점이 있다.

    dynamic_cast<>()
    클래스 포인터를 형변환할 때 기본적으로 dynamic_cast를 사용하고 dynamic_cast를 쓸 수 없는 경우에 static_cast를 사용한다. dynamic_cast는 실행 시간에 객체의 타입 정보를 참조하여 형변환하기 때문에 다형성(polymorphic)을 가지지 않은 객체는 변환할 수 없다. 가상 멤버를 가진 클래스에는 dynamic_cast를, 가상 멤버가 없는 클래스에는 static_cast를 사용하자. 가상 멤버를 가지고 있는 경우에도 static_cast를 사용할 수 있지만 안전하지 않으므로 안쓰는 게 좋다. 그리고 dynamic_cast는 형변환에 실패하면 0을 리턴하기 때문에 실행 중에 체크할 수 있다.
    문법상 형변환이 가능하더라도, 실제로 형 변환이 가능한가를 런타임에 검사를 한다.
    그리고 dynamic_cast 를 써야 한다면, 기반 클래스의 인터페이스가 무척 부족한 것이므로, 한번쯤 디자인에 대해서도 고려를 해봐야 될 듯 싶다.

    const_cast<>()
    const 객체의 const 특성을 없애고 싶을 때는 const_cast를 사용한다.


    참조 사이트:
Designed by Tistory.