2011-08-30 6 views
2

static_cast의 경우 기본 제공 유형 변환 기능이 없으면 static_cast을 사용하여 변환을 수행 할 수 없습니다. 그러나 리턴 유형이 유효하다고 간주하여 유형에 대해 reinterpret_cast을 수행 할 수 있습니다.명시 적 유형 변환 요구 사항

int main() 
{ 
    WORD word; 
    HWND hwnd = static_cast<HWND>(word); // error 
    HWND hwnd = reinterpret_cast<HWND>(word); // ok, considering a valid handle is returned. 
} 

는 static_cast 함께 할 명시 적 형식 변환은 reinterpret_cast 달리 변환 기능을 필요로합니까?

+0

어 ... 질문은 구체적으로 무엇입니까? –

+0

@Jason - static_cast가 오류 일 때 reinterpret_cast도 마찬가지입니다. 컴파일러는 당신에게 말하지 않을 것입니다. –

답변

2

reinterpret_cast 완전히 관련없는 유형을 변환 할 수 있습니다. 단지 메모리 덩어리를 다른 유형으로 취급합니다. 따라서 컴파일이나 런타임 오류는 발생하지 않지만 단지 (일반적으로) 오류가 발생하지 않기 때문에 매우 안전하지 않습니다.

static_cast은 컴파일 타임에 캐스트의 유효성을 검사합니다. 유형을 다른 유형으로 처리 할 수없는 경우 static_cast은 캐스트를 시도 할 때 컴파일 시간 오류를 제공합니다. 형식 사이의 암시 적 변환 (예 : int 또는 float * 포인터)과 명시 적 변환 함수 (또는 암시 적 변환)를 호출 할 수도 있습니다.

암시 적 변환 inbuilt 함수가있는 암시 적 캐스트를 수행 할 수 있다고 말할 수 있습니다. 혼란이 있다면 보통 C 스타일 캐스팅의 대체품으로 간주됩니다.

+0

한 가지 분명한 것은 'reinterpret_cast'는 타입을 다시 원래 타입으로 변환 할 때 동일한 결과를 얻게된다는 것입니다. –

+1

"reinterpret_cast에 의해 수행 된 매핑은 다른 표현을 생성 할 수도, 생성하지 않을 수도 있습니다 원래 값에서. " 특정 상황에서만 reinterpret_cast가 안정적입니다. 피해야합니다. –

+0

호기심에서 벗어나'reinterpret_cast (myfloat)!= static_cast (myfloat)', 'sizeof (int) == sizeof (float)'에 따라 사양에 따라? –

0

C++ 캐스트는 포인터와 참조를 캐스팅 할 때 가장 적합합니다.

구체적으로

void foo (Base & b) { 
    if (b .is_a_Foo()) 
     static_cast <Foo &> (b) .bar(); 
    else 
     b .do_default_bar(); 
    dynamic_cast <Baz &> (b) .something(); // throws if invalid conversion 
} 

char data [4]; 
* reinterpret_cast <float *> (data) = 1.23; 

윈도우 API는 위에서 아래로 끔찍한 해킹 - 당신의 예는, reinterpret_cast 원래 의도에 충실 (그리고 존경하는 세계를 위해 그것을 강조)와 기본적으로 "타입 시스템을 폐기하고 원시 비트를 사용하는 것을 의미합니다 : 나를 믿으십시오".

0

는 기본적으로 static_cast호환 클래스 대상 유형의 크기의 메모리를 할당하고 어떤 새로운 개체가 완료입니다 확인하지 않고 수 있습니다 무엇 하지만 채 웁니다. 저가 당신에게 예를 보자 : 당신의 예에서

class A { 
public: 
    int a; 
}; 

class B : public A { 
public: 
    int c; 
    int b; 
}; 

int main() 
{ 
    A *a = new A; 
    a->a = 5; 
    B *b = new B; 
    b->a = 6; 
    b->b = 7; 
    b->c = 8; 

    B* bb = static_cast<B*>(a); 
    A* aa = static_cast<A*>(b); 

    cout << bb->a << endl; // 5 
    cout << bb->b << endl; // scrap value from memory 
    // member b was not initialized, because it was not found in A 

    cout << aa->a << endl; // 6 

    return 0; 
} 

hwndvoid *wordunsigned short입니다 때문에 정적 캐스트가 유효하지 않습니다. C++ 캐스트의 경우 모든 유형을 클래스로 간주 할 수 있습니다.

reinterpret_cast 작품 항상입니다. 그것은 단지 이진 복사입니다.