2010-07-19 9 views
4

가능한 중복 : 좋은 일 듯 때문에 몇 일 전까지
When should static_cast, dynamic_cast and reinterpret_cast be used?C++ 타입 캐스팅

는, 나는 항상 ++ C에서 C 스타일의 유형 캐스팅 사용했습니다. 나는 C++에서 C를 사용하는 것이 매우 나쁘다는 것을 최근에 발견했다.

나는 C++ 캐스팅을 사용 해본 적이 없어서 누군가가 자신의 말로 말해 줄 수 있는지 궁금하다. static_cast reinterpret_cast 및 const_cast는 무엇입니까?

const_cast 나는 뭔가에서 "const"를 제거하는 것을 알고 있지만, 나는 그들 사이의 차이점이 무엇인지, 그리고 다른 상황에서 사용해야 할 것이 있는지 잘 모르겠습니다.

+0

아마도 좋은 책을 얻고 C++를 올바르게 배워야합니다. :) http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list 그리고 좋은 요약 여기에 : http://stackoverflow.com/questions/28002/regular-cast- vs-static-cast-vs-dynamic-cast/1255015 # 1255015 – GManNickG

+1

그리고 여기 http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be- used –

+1

"매우 나쁨"이 아니며, 위험하며, 약간의 관리가 필요하며 유지 보수 함정이 있습니다. 실제로 원시 포인터의 사용과 동일합니다. C에서는 더 좋은 옵션이 없지만 C++에서는 의미를 표현하고 컴파일러에서보다 나은 경고 및 오류를 생성 할 수있는 도구를 제공합니다. –

답변

-2

static_cast - 예를 들어 캐스트입니다. (int) 1.000. 비용이 들지 않고 실패 할 수도 없습니다. 하지만 구문 가치가있는 설탕 (편집기에서 검색하는 데 유용합니다) 만 가치가 있습니다.

reinterpret_cast -는 (void *)에 해당하는 C++입니다. 그것은 당신의 얼굴에서 날아갈 수 있습니다. 이것을 사용하여 컴파일러에게 알려주고, 다른 프로그래머에게는 매우 조심해야합니다.

dynamic_cast는 변환을 수행 할 수없는 경우 null을 반환하는보다 안전한 버전입니다. 이것은 런타임 비용이 적습니다.

When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

+0

올바르지 않습니다. C-cast는'static_cast'보다 훨씬 많은 작업을 수행하며'reinterpret_cast'는 결코 null을 반환하지 않습니다. – GManNickG

+0

죄송하지만 맞지 않습니다. reinterpret_cast는 일반적인 c-cast입니다. static_cast는 컴파일 타임에 체크 된 캐스트입니다. 여러분이 dynamic_cast를 생각하고 있다고 생각합니다. –

+0

'reinterpret_cast'는 C 캐스트와 동일하다고 말하는 것은 맞지 않습니다. 모든 C 캐스트가 C++ 캐스트를 사용하여 빌드 될 수있는 것은 아니며 'static_cast' 또는'reinterpret_cast'와 선택적으로'const_cast'가 필요할 수도 있습니다. –

1

static_cast<TYPE>(e-of-TYPE2) 안전한 캐스트입니다 참조하십시오. TYPE2에서 TYPE1 로의 변환이 있음을 의미합니다.

reinterpret_cast은 거의 모든 변환을 허용한다는 점에서 C 캐스트와 비슷합니다 (일부 제한 사항 포함). 컴파일러는 형식 변환이 정확한지 알기를 기대합니다.

static_castreinterpret_cast도 허용되지 않는 것이 const를 제거하는 것입니다. I.E. const char *이 있고 char *으로 전송해야하는 경우 static_cast이나 reinterpret_cast도 허용되지 않습니다. 대신 const_cast은 친구입니다. const_cast은 유형에서 const 수정자를 제거하는 데 사용됩니다.

+1

'const_cast'는 당신의 친구가 아닙니다. 너무 어리석지 마십시오. 최후의 수단이 될 것입니다. 'const_cast'가 필요한 상황의 99 %는 실제로 리팩토링이 필요합니다. –

+0

reinterpret_cast의 제한 사항은 다음과 같습니다. 소스 유형과 대상 유형이 모두 동일한 크기 여야합니다. – YeenFei

3

"C 캐스트가 좋지 않습니다."라는 말 자체가 C 스타일의 캐스트를 사용하는 것만 큼 나쁘다는 말입니다.

"새로운"C++ 스타일 캐스트가 사용되어야하는 영역은 계층 형 캐스트 ​​(업 캐스팅, 다운 캐스트, 크로스 캐스트), const-correctness 캐스트 및 재 해석 캐스트입니다. 산술 캐스트의 경우 C 스타일의 캐스트는 완벽하게 잘 작동하고 위험하지 않으므로 C++ 코드에서 안전하게 사용할 수 있습니다. 사실, 저는 실제로 산술 캐스트를 특별히 다른 캐스트 유형과 다르게 보이도록하기 위해 특별히 C 스타일의 캐스트를 산술 캐스트로 사용하는 것이 좋습니다.

+0

C 스타일의 캐스트 (1)는 간단한 검색으로 찾을 수 없으며 (2) 경고없이 나쁜 것을 수행합니다. 따라서 C 스타일의 캐스트를 최소화하는 것이 좋습니다. 숫자 형의 형변환은 (1)은 여전히 ​​고통을 겪고 있지만 (2)는 그렇지 않은 생성자 스타일의 형 변환으로 수행 될 수 있습니다. –

+0

@Ben Voigt : 첫 번째로, 캐스트를 검색하는 문제는 캐스트가 잘 생각한 관례 시스템 (예 : 위에서 설명한대로) 내에서 사용 된 경우 나에게 실제로 유용한 것으로 나타나지 않습니다. 그리고, 아니, 그들은 이런 식으로 사용할 때 아무런 경고없이 나쁜 일을하지 않습니다. 둘째, C 스타일의 캐스팅보다 기능적인 스타일의 자동차를 사용하는 것이 어떨까요? 또한 functional-style은 'unsigned int'와 같은 다중 토큰 유형 이름과 함께 사용할 수 없습니다. – AnT

1
  1. static_cast는 프로그래머가 객체의 유형을 알고 컴파일러에게 알리고 자 할 때 컴파일 타임에 캐스트를 수행하는 표준 C++ 방법입니다.
  2. dynamic_cast는 런타임시 캐스트가 검사되는 '(T) obj'와 유사합니다.
  3. reinterpret_cast는 런타임 검사없이 다른 개체간에 전송하는 데 사용됩니다.
  4. const_cast는 const 및 volatile 한정자를 제거하여 동일한 유형으로 명시 적으로 변환합니다.