문제

이 질문에 이미 답변이 있습니다.

  • 언제 static_cast, dynamic_cast, const_cast 및reinterpret_cast를 사용 하시겠습니까? 8 답변

    저는 거의 20 년 동안 C 및 C ++ 코드를 작성해 왔지만,이 언어 중 한 가지 측면이 제가 실제로 이해하지 못했던 부분이 있습니다.나는 분명히 일반 캐스트를 사용했습니다. 라코 디스

    사방에 캐스트가 다른 두 가지 유형이있는 것 같고 차이점을 모르겠습니다.다음 코드 줄의 차이점은 무엇입니까? 라코 디스

도움이 되었습니까?

해결책

static_cast

static_cast는 몇 가지 제한 사항과 추가 사항을 제외하고 기본적으로 암시 적 변환을 되돌리려는 경우에 사용됩니다. static_cast는 런타임 검사를 수행하지 않습니다. 특정 유형의 객체를 참조한다는 것을 알고있는 경우에 사용해야하므로 검사가 필요하지 않습니다. 예 : 라코 디스

이 예에서는 MyClass 객체를 전달했음을 알고 있으므로이를 확인하기 위해 런타임 검사가 필요하지 않습니다.

dynamic_cast

dynamic_cast는 객체의 동적 유형이 무엇인지 모를 때 유용합니다. 참조 된 객체가 기본 클래스로 캐스팅 된 유형을 포함하지 않는 경우 null 포인터를 반환합니다 (참조로 캐스팅 할 때이 경우 bad_cast 예외가 발생 함). 라코 디스

다운 캐스트 (파생 클래스로 캐스트)하고 인수 유형이 다형성이 아닌 경우 dynamic_cast를 사용할 수 없습니다. 예를 들어 Base에 가상 함수가 포함되어 있지 않기 때문에 다음 코드는 유효하지 않습니다. 라코 디스

"up-cast"(기본 클래스로 캐스트)는 항상 static_castdynamic_cast 모두에서 유효하며, "up-cast"는 암시 적 변환이므로 캐스트 없이도 항상 유효합니다.

레귤러 캐스트

이 캐스트를 C 스타일 캐스트라고도합니다. C 스타일 캐스트는 기본적으로 일련의 C ++ 캐스트를 시도하고 유전자 코드 코드를 고려하지 않고 작동하는 첫 번째 C ++ 캐스트를 취하는 것과 동일합니다. 말할 필요도없이 이것은 dynamic_cast, const_caststatic_cast를 모두 결합하여 훨씬 더 강력하지만, reinterpret_cast를 사용하지 않기 때문에 안전하지도 않습니다.

또한 C 스타일 캐스트를 사용하면이 작업을 수행 할 수있을뿐만 아니라 개인 기본 클래스로 안전하게 캐스트 할 수 있으며 "동등한"dynamic_cast 시퀀스는 이에 대한 컴파일 시간 오류를 제공합니다. .

어떤 사람들은 간결함 때문에 C 스타일의 캐스트를 선호합니다. 나는 숫자 형변환에만 사용하고, 사용자 정의 유형이 관련 될 때 더 엄격한 검사를 제공하므로 적절한 C ++ 형변환을 사용합니다.

다른 팁

정적 캐스트

정적 캐스트는 호환 가능한 유형 간의 변환을 수행합니다. C 스타일 캐스트와 비슷하지만 더 제한적입니다. 예를 들어, C 스타일 캐스트는 정수 포인터가 문자를 가리 키도록 허용합니다. 라코 디스

이로 인해 할당 된 메모리 1 바이트를 가리키는 4 바이트 포인터가 생성되기 때문에이 포인터에 쓰면 런타임 오류가 발생하거나 일부 인접 메모리를 덮어 씁니다. 라코 디스

C 스타일 캐스트와 달리 정적 캐스트를 사용하면 컴파일러가 포인터 및 포인트 데이터 유형이 호환되는지 확인할 수 있으므로 프로그래머가 컴파일 중에 잘못된 포인터 할당을 포착 할 수 있습니다. 라코 디스

캐스트 재 해석

포인터 변환을 강제하기 위해 C 스타일 캐스트가 백그라운드에서하는 것과 같은 방식으로 재 해석 캐스트가 대신 사용됩니다. 라코 디스

이 캐스트는 한 포인터 유형에서 다른 비 호환 포인터 유형으로의 변환과 같이 관련되지 않은 특정 유형 간의 변환을 처리합니다. 기본 비트 패턴을 변경하지 않고 단순히 데이터의 이진 복사를 수행합니다. 이러한 저수준 작업의 결과는 시스템에 따라 다르므로 이식 할 수 없습니다. 완전히 피할 수없는 경우주의해서 사용해야합니다.

동적 캐스트

이것은 개체 포인터와 개체 참조를 상속 계층 구조의 다른 포인터 또는 참조 유형으로 변환하는 데만 사용됩니다. 포인터가 대상 유형의 전체 개체를 참조하는지 런타임 검사를 수행하여 가리키는 개체가 변환 될 수 있는지 확인하는 유일한 캐스트입니다. 이 런타임 검사가 가능하려면 개체가 다형성이어야합니다. 즉, 클래스는 하나 이상의 가상 함수를 정의하거나 상속해야합니다. 이는 컴파일러가 이러한 개체에 필요한 런타임 유형 정보 만 생성하기 때문입니다.

동적 캐스트 예

아래 예제에서 MyChild 포인터는 동적 캐스트를 사용하여 MyBase 포인터로 변환됩니다. 하위 개체에 전체 기본 개체가 포함되어 있기 때문에이 파생에서 기본으로의 변환이 성공합니다. 라코 디스

다음 예제에서는 MyBase 포인터를 MyChild 포인터로 변환하려고합니다. Base 개체에 완전한 자식 개체가 포함되어 있지 않기 때문에이 포인터 변환이 실패합니다. 이를 나타 내기 위해 동적 캐스트는 널 포인터를 리턴합니다. 이렇게하면 런타임 중에 변환이 성공했는지 여부를 편리하게 확인할 수 있습니다. 라코 디스

포인터 대신 참조가 변환되면 bad_cast 예외가 발생하여 동적 캐스트가 실패합니다. 이것은 try-catch 문을 사용하여 처리해야합니다. 라코 디스

동적 또는 정적 캐스트

동적 캐스트 사용의 장점은 프로그래머가 런타임 중에 변환이 성공했는지 여부를 확인할 수 있다는 것입니다. 단점은이 검사와 관련된 성능 오버 헤드가 있다는 것입니다. 이러한 이유로 파생에서 기본으로의 변환이 절대 실패하지 않기 때문에 정적 캐스트를 사용하는 것이 첫 번째 예에서 선호되었을 것입니다. 라코 디스

그러나 두 번째 예에서는 변환이 성공하거나 실패 할 수 있습니다. MyBase 개체에 MyBase 인스턴스가 포함되어 있으면 실패하고 MyChild 인스턴스가 포함되어 있으면 성공합니다. 일부 상황에서는 런타임까지 알 수 없습니다. 이 경우 동적 캐스트가 정적 캐스트보다 나은 선택입니다. 라코 디스

동적 캐스트 대신 정적 캐스트를 사용하여 기본에서 파생 된 변환을 수행했다면 변환이 실패하지 않았을 것입니다. 불완전한 개체를 참조하는 포인터를 반환했을 것입니다. 이러한 포인터를 역 참조하면 런타임 오류가 발생할 수 있습니다. 라코 디스

상수 출연자

이것은 주로 const 수정자를 추가하거나 제거하는 데 사용됩니다.

변수. 라코 디스

const cast를 사용하면 상수 값을 변경할 수 있지만 그렇게하면 런타임 오류가 발생할 수있는 잘못된 코드입니다.예를 들어 상수가 읽기 전용 메모리 섹션에있는 경우 발생할 수 있습니다. 라코 디스

포인 티를 수정하지 않더라도 상수가 아닌 포인터 인수를받는 함수가있을 때 주로 상수 캐스트가 사용됩니다. 라코 디스

그런 다음 const 캐스트를 사용하여 함수에 상수 변수를 전달할 수 있습니다. 라코 디스

출처 및 기타 설명

C ++ 프로그래밍 / 유형 변환 .

다른 모든 캐스트 유형에 대한 좋은 설명이 포함되어 있습니다. 위 링크에서 가져온 다음 : <인용구>

const_cast

const_cast (expression) const_cast <> ()는 추가 / 제거에 사용됩니다. 변수의 const (ness) (또는 volatile-ness)

static_cast

static_cast (expression) static_cast <> ()는 정수 유형. '예' char-> long, int-> short 등

정적 캐스트는 포인터를 관련 유형으로 캐스트하는데도 사용됩니다. void *를 적절한 유형으로 캐스팅하는 예.

dynamic_cast

동적 캐스트는 런타임에 포인터와 참조를 변환하는 데 사용됩니다. 일반적으로 포인터 또는 참조를 위 또는 아래로 캐스팅하기위한 목적 상속 체인 (상속 계층)

dynamic_cast (표현식)

대상 유형은 포인터 또는 참조 유형이어야하며 expression은 포인터 또는 참조로 평가되어야합니다. 다이나믹 캐스트 작품 표현식이 참조하는 객체 유형이 대상 유형과 호환되며 기본 클래스에는 하나 이상의 가상 멤버 기능. 그렇지 않은 경우 캐스팅되는 표현 유형 포인터이고 참조에 대한 동적 캐스트 인 경우 NULL이 반환됩니다. 실패하면 bad_cast 예외가 발생합니다. 실패하지 않으면 동적 cast는 객체에 대한 대상 유형의 포인터 또는 참조를 반환합니다. 어떤 표현이 언급되었는지.

재 해석 _ 캐스트

재 해석 캐스트는 단순히 한 유형을 다른 유형으로 비트 단위로 캐스트합니다. 모든 포인터 또는 일체형은 재 해석 캐스트로 다른 것으로 캐스팅 될 수 있습니다. 쉽게 오용을 허용합니다. 예를 들어, 캐스트를 재 해석하면 안전하지 않게 정수 포인터를 문자열 포인터로 캐스팅 할 수 있습니다.

참고로, Bjarne Stroustrup은 C 스타일 캐스트는 피해야하며 가능하면 static_cast 또는 dynamic_cast를 사용해야한다고 언급 한 것으로 생각합니다.

Barne Stroustrup의 C ++ 스타일 FAQ

할 일에 대한 조언을 따르십시오.저는 C ++ 전문가가 아닙니다.

C 스타일 캐스트를 사용하지 마십시오.

C 스타일 캐스트는 const와 재 해석 캐스트가 혼합되어 있으며 코드에서 찾아서 바꾸는 것이 어렵습니다.C ++ 애플리케이션 프로그래머는 C 스타일 캐스트를 피해야합니다.

C 스타일 캐스트는 const_cast, static_cast 및 reinterpret_cast를 결합합니다.

C ++에 C 스타일 캐스트가 없었 으면 좋겠습니다.C ++ 캐스트는 적절하게 눈에 띄고 (올바르게, 캐스트는 일반적으로 나쁜 일을 함을 나타냄) 캐스트가 수행하는 다양한 종류의 변환을 적절하게 구분합니다.또한 비슷한 모양의 함수를 작성할 수 있습니다.boost :: lexical_cast는 일관성 측면에서 매우 좋습니다.

dynamic_cast에는 런타임 유형 검사 기능이 있으며 참조 및 포인터에서만 작동하는 반면 static_cast는 런타임 유형 검사를 제공하지 않습니다.자세한 내용은 MSDN 문서 static_cast Operator <를 참조하십시오./ a> .

dynamic_cast는 포인터 및 참조 유형 만 지원합니다.유형이 포인터 인 경우 캐스트가 불가능한 경우 NULL를 반환하고 유형이 참조 유형 인 경우 예외를 throw합니다.따라서 dynamic_cast는 객체가 주어진 유형인지 확인하는 데 사용할 수 있지만 static_cast는 할 수 없습니다 (단순히 유효하지 않은 값으로 끝남).

C 스타일 (및 기타) 캐스트는 다른 답변에서 다루었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top