일반 캐스트 대 정적 캐스트 대 동적 캐스트
저는 거의 20년 동안 C와 C++ 코드를 작성해왔지만, 이 언어의 한 가지 측면을 제대로 이해하지 못했습니다. 저는 분명히 일반 형변환을 사용했습니다.
MyClass *m = (MyClass *)ptr;
를 사용했지만 다른 두 가지 유형의 캐스트가 있는 것 같고 그 차이점을 모르겠습니다. 다음 코드 줄의 차이점은 무엇인가요?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
1654
8
< h2> static_cast< /h2>;;; '암시적 변환에 사용할 경우에는 기본적으로 로렌아줌마가 반전하려면 static_cast' 에서 몇 가지 제한 및 추가. '' static_cast 런타임용으로 개발하십시오 검사를 수행하지 않습니다. 이 경우 사용해야 합니다 알게 될 것이고, 따라서 특정 유형의 객체에 대한 검사가 불필요한) 는 다음과 같은 뜻이 있다. 예:
이 예에서 a ',' 오빠, 통과했을거에요 알잖나 MyClass 와 t # 39, 따라서 모든 런타임 검사를 객체에는 isn& 이를 위해 필요한.
< h2> dynamic_cast< /h2>;;;
39, dynamic_cast '' t know what the don& 때 유용합니다 동적임 유형의 객체인지. 이 경우, t # 39 라고 null 포인터입니다 되돌려줍니다 객체에는 doesn& 주조 유형을 포함될 것으로 기본 클래스 (때는사용할 bad_cast idfsysobject. 발생하며, 이 경우 'a' 캐스트 참조).
Dynamic_cast 돌아가도 록 하여주소서 경우 사용할 수 없습니다 '' (cast 를 파생 클래스) 와 인수 유형 다형 않습니다. 예를 들어, 다음 코드는 올바르지 않은 '기본' doesn& # 39, t 포함될 수 있기 때문에, 가상 함수.
오버클로킹된 " up-cast"; (캐스트 기본 클래스) 과 함께 'static_cast, 또한 항상 유효함' 와 '없이' 캐스트 (cast), dynamic_cast 표시됨과 " up-cast"; 백업이었습니다 암시적입니다 변환.
일반 Cast< /h2> h2> <;;;
C 스타일 이러한 캐스트 (cast) 이라 부르기도 한다. 기본적으로 c 스타일 캐스팅 할 수 있는 다양한 시퀀스에만 동일해집니다 아웃하려면 C++ 등을 고려할 때 사용할 수 있는 첫 번째 c++컴파일러는 캐스트 방송, dynamic_cast 없이 ','. 말할 나위 없이, 이 때문에 훨씬 더 강력한 결합하였습니다 const_cast ',' 모든 's 도 있지만, reinterpret_cast' 와 ',' # 39 it& static_cast, dynamic_cast 사용하지 않으므로 '안전하지 않은'.
또한 c 스타일 캐스트 (cast) 이 있지만 안전하게 할 수 있을 뿐 아니라 수 있고, 민간 기본 클래스 " equivalent"; 컴파일 타임 '' static_cast e0100042.log 제공하십시오 오류가 있는 것이다.
어떤 사람들은 그들의 c 스타일 때문에 선호하는 경향성을 간략하게. 내가 사용하는 숫자 방송 전용으로 사용할 수 있도록 관련 방송 때 해당 C++ 사용자 정의 유형은 대로 대폭 제공하십시오 검사.
< h2> 정적임 cast< /h2>;;;
정적 사이에 캐스트 향상합니다 변환에는 호환적 유형. 그런데 이 더 제한적인 캐스트 (cast), c 스타일 것과 비슷하다. 예를 들어, 정수 포인터를 c 스타일 캐스트 챨 가리킬 수 있도록 했다.
그 결과 가리키는 포인터를 할당된 메모리, 이후 4 바이트, 1 바이트 또는 런타임 오류가 발생할 것으로 이 포인터입니다 인컨텍스트 덮어쓰여집니다 인접한 메모리를 쓸 수 있다.
반대로 하면 컴파일러는 정적 캐스트 (cast), c 스타일 및 푸앵티 포인터입니다 확인합니다, 데이터 유형은 호환적 수 있는 이 잘못된 포인터입니다 할당에서는 프로그래머용 잡기 위해 컴파일하는 동안.
< h2> 재해석을 cast< /h2>;;;
강제로 포인터입니다 변환, 배경, 캐스트 (cast) 가 이 같은 방식으로 재해석을 c 스타일 대신 사용될 것이라고 밝혔다.
이 같은 다른 유형을 연관해제된 유형은상위 사이에 캐스트 핸들을 변환에는 특정 한 포인터입니다 호환되지 않는 포인터입니다 유형:. 이진 데이터 복제본만 기본 비트 패턴을 변경하지 않고 단순히 수행할 예정이다. 참고로, 결과 등 낮은 수준의 작업은 시스템-특정, 따라서 이동형이든지 없습니다. 이 경우 모두 피할 수 없는 주의해서 사용해야 합니다.
< h2>, 동적 cast< /h2>;;
이건 객체 포인터나 참조를 쉽게 다른 개체 참조 포인터 및 변환하십시오 데만 추상형데이터타입 상속 계층 구조에서. 이는 보장하는 유일한 캐스트, 런타임 검사를 수행하여 객체에는 abc. 변환하지는 수 있는 완벽한 객체 포인터 () 는 대상 유형:. 이 런타임 검사를 위한 객체에는 다형 수 있어야 합니다. 즉, 클래스 상속 또는 하나 이상의 가상 함수를 정의해야 합니다. 이러한 객체에 대한 필요한 런타임 타입 정보 미디어만을 발령합니다 컴파일러에서 때문이다.
아래의 예에서 a 미차일드 포인터가 전환해 포인터입니다 미바제 사용하여 동적 캐스트. 이 때문에 전환에 성공한 파생됨 기지로 자식 객체는 객체를 포함하는 완벽한 기본.
다음 예제는 한 포인터 시도_횟수 변환하십시오 미바제 미차일드 포인터입니다. 이후 이 포인터입니다 포함되지 않은 자식 객체는 완료하십시오 기본 객체 변환 실패합니다. 즉, 엑셀러레이터는 나타내십시오 동적임 캐스트 되돌려줍니다 null 포인터입니다. 따라서 런타임 시 편리하게 전환 여부를 확인하는 데 성공했다.
C++ 프로그래밍/타입 캐스팅]1* 문서를 참조하세요.
여기에는 다양한 형변환 유형에 대한 좋은 설명이 포함되어 있습니다. 다음은 위 링크에서 가져온 것입니다:
사용하지 않는 c 스타일 방송.
39 는 상수 c 스타일 방송 및 재해석을 함께 캐스팅, it& 코드에서, s 찾기와 바꾸기 어렵다. C++ 응용 프로그램 프로그래머용 피할 수 있는 c 스타일 "라고 언급했다.
비야네 스트롭스트룹 fyi, I believe 는 피할 수 있는 c 스타일 방송 등은 콩지름에 static_cast, 그리고 그 인용 또는 dynamic_cast 가능하면.
# 39 의 c++컴파일러는 반 Stroustrup& 스타일입니까 FAQ
시행하십시오 뭐하러요 조언을 하는 것입니다. # 39 m 되는 지주요 c++컴파일러는 i& 거리가 멀다.
C 스타일 형변환은 const_cast, static_cast, reinterpret_cast를 통합합니다.
C++에 C 스타일 형변환이 없었으면 좋겠습니다. C++ 형변환은 제대로 눈에 띄고(형변환은 일반적으로 나쁜 일을 한다는 것을 나타냅니다) 형변환이 수행하는 다양한 종류의 변환을 적절히 구분합니다. 또한 boost::lexical_cast와 같이 비슷해 보이는 함수를 작성할 수 있어 일관성 측면에서 매우 좋습니다.
동적_캐스트
는 런타임 형 검사 기능이 있으며 참조 및 포인터에서만 작동하는 반면,
정적_캐스트`는 런타임 형 검사를 제공하지 않습니다. 자세한 내용은 MSDN 문서 static_cast 연산자를 참조하세요.'' 만을 지원하는 참조 포인터, dynamic_cast 추상형데이터타입. 이 경우 'NULL' 되돌려줍니다 캐스트 불가능한 경우 예외를 던지는 경우 유형 또는 타입 () 은 포인터입니다 참조입니다 유형:. 이에 따라 ',' dynamic_cast 사용할 수 있는 특정 유형의 static_cast 객체인지 여부를 확인할 수 없는 ',' (간단히 끝날 수 있습니다 잘못된 값을 가진).
그동안 방송 c 스타일 (다른) 에서 다루는 다른 분입니다.