일반 캐스트 대 정적 캐스트 대 동적 캐스트

저는 거의 20년 동안 C와 C++ 코드를 작성해왔지만, 이 언어의 한 가지 측면을 제대로 이해하지 못했습니다. 저는 분명히 일반 형변환을 사용했습니다.

MyClass *m = (MyClass *)ptr;

를 사용했지만 다른 두 가지 유형의 캐스트가 있는 것 같고 그 차이점을 모르겠습니다. 다음 코드 줄의 차이점은 무엇인가요?

MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
질문에 대한 의견 (5)
해결책

&lt h2&gt static_cast&lt /h2>;;; '암시적 변환에 사용할 경우에는 기본적으로 로렌아줌마가 반전하려면 static_cast' 에서 몇 가지 제한 및 추가. '' static_cast 런타임용으로 개발하십시오 검사를 수행하지 않습니다. 이 경우 사용해야 합니다 알게 될 것이고, 따라서 특정 유형의 객체에 대한 검사가 불필요한) 는 다음과 같은 뜻이 있다. 예:

void func(void *data) {
  // Conversion from MyClass* -> void* is implicit
  MyClass *c = static_cast(data);
  ...
}

int main() {
  MyClass c;
  start_thread(&func, &c)  // func(&c) will be called
      .join();
}

이 예에서 a ',' 오빠, 통과했을거에요 알잖나 MyClass 와 t # 39, 따라서 모든 런타임 검사를 객체에는 isn& 이를 위해 필요한.

&lt h2&gt dynamic_cast&lt /h2>;;;

39, dynamic_cast '' t know what the don& 때 유용합니다 동적임 유형의 객체인지. 이 경우, t # 39 라고 null 포인터입니다 되돌려줍니다 객체에는 doesn& 주조 유형을 포함될 것으로 기본 클래스 (때는사용할 bad_cast idfsysobject. 발생하며, 이 경우 'a' 캐스트 참조).

if (JumpStm *j = dynamic_cast(&stm)) {
  ...
} else if (ExprStm *e = dynamic_cast(&stm)) {
  ...
}

Dynamic_cast 돌아가도 록 하여주소서 경우 사용할 수 없습니다 '' (cast 를 파생 클래스) 와 인수 유형 다형 않습니다. 예를 들어, 다음 코드는 올바르지 않은 '기본' doesn& # 39, t 포함될 수 있기 때문에, 가상 함수.

struct Base { };
struct Derived : Base { };
int main() {
  Derived d; Base *b = &d;
  dynamic_cast(b); // Invalid
}

오버클로킹된 &quot up-cast"; (캐스트 기본 클래스) 과 함께 'static_cast, 또한 항상 유효함' 와 '없이' 캐스트 (cast), dynamic_cast 표시됨과 &quot up-cast"; 백업이었습니다 암시적입니다 변환.

일반 Cast&lt /h2&gt h2&gt <;;;

C 스타일 이러한 캐스트 (cast) 이라 부르기도 한다. 기본적으로 c 스타일 캐스팅 할 수 있는 다양한 시퀀스에만 동일해집니다 아웃하려면 C++ 등을 고려할 때 사용할 수 있는 첫 번째 c++컴파일러는 캐스트 방송, dynamic_cast 없이 ','. 말할 나위 없이, 이 때문에 훨씬 더 강력한 결합하였습니다 const_cast ',' 모든 's 도 있지만, reinterpret_cast' 와 ',' # 39 it& static_cast, dynamic_cast 사용하지 않으므로 '안전하지 않은'.

또한 c 스타일 캐스트 (cast) 이 있지만 안전하게 할 수 있을 뿐 아니라 수 있고, 민간 기본 클래스 &quot equivalent"; 컴파일 타임 '' static_cast e0100042.log 제공하십시오 오류가 있는 것이다.

어떤 사람들은 그들의 c 스타일 때문에 선호하는 경향성을 간략하게. 내가 사용하는 숫자 방송 전용으로 사용할 수 있도록 관련 방송 때 해당 C++ 사용자 정의 유형은 대로 대폭 제공하십시오 검사.

해설 (17)

&lt h2&gt 정적임 cast&lt /h2>;;;

정적 사이에 캐스트 향상합니다 변환에는 호환적 유형. 그런데 이 더 제한적인 캐스트 (cast), c 스타일 것과 비슷하다. 예를 들어, 정수 포인터를 c 스타일 캐스트 챨 가리킬 수 있도록 했다.

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

그 결과 가리키는 포인터를 할당된 메모리, 이후 4 바이트, 1 바이트 또는 런타임 오류가 발생할 것으로 이 포인터입니다 인컨텍스트 덮어쓰여집니다 인접한 메모리를 쓸 수 있다.

*p = 5; // run-time error: stack corruption

반대로 하면 컴파일러는 정적 캐스트 (cast), c 스타일 및 푸앵티 포인터입니다 확인합니다, 데이터 유형은 호환적 수 있는 이 잘못된 포인터입니다 할당에서는 프로그래머용 잡기 위해 컴파일하는 동안.

int *q = static_cast(&c); // compile-time error

&lt h2&gt 재해석을 cast&lt /h2>;;;

강제로 포인터입니다 변환, 배경, 캐스트 (cast) 가 이 같은 방식으로 재해석을 c 스타일 대신 사용될 것이라고 밝혔다.

int *r = reinterpret_cast(&c); // forced conversion

이 같은 다른 유형을 연관해제된 유형은상위 사이에 캐스트 핸들을 변환에는 특정 한 포인터입니다 호환되지 않는 포인터입니다 유형:. 이진 데이터 복제본만 기본 비트 패턴을 변경하지 않고 단순히 수행할 예정이다. 참고로, 결과 등 낮은 수준의 작업은 시스템-특정, 따라서 이동형이든지 없습니다. 이 경우 모두 피할 수 없는 주의해서 사용해야 합니다.

&lt h2&gt, 동적 cast&lt /h2>;;

이건 객체 포인터나 참조를 쉽게 다른 개체 참조 포인터 및 변환하십시오 데만 추상형데이터타입 상속 계층 구조에서. 이는 보장하는 유일한 캐스트, 런타임 검사를 수행하여 객체에는 abc. 변환하지는 수 있는 완벽한 객체 포인터 () 는 대상 유형:. 이 런타임 검사를 위한 객체에는 다형 수 있어야 합니다. 즉, 클래스 상속 또는 하나 이상의 가상 함수를 정의해야 합니다. 이러한 객체에 대한 필요한 런타임 타입 정보 미디어만을 발령합니다 컴파일러에서 때문이다.

  • 동적임 캐스트 참조용이므로 *

아래의 예에서 a 미차일드 포인터가 전환해 포인터입니다 미바제 사용하여 동적 캐스트. 이 때문에 전환에 성공한 파생됨 기지로 자식 객체는 객체를 포함하는 완벽한 기본.

class MyBase 
{ 
  public:
  virtual void test() {}
};
class MyChild : public MyBase {};

int main()
{
  MyChild *child = new MyChild();
  MyBase  *base = dynamic_cast(child); // ok
}

다음 예제는 한 포인터 시도_횟수 변환하십시오 미바제 미차일드 포인터입니다. 이후 이 포인터입니다 포함되지 않은 자식 객체는 완료하십시오 기본 객체 변환 실패합니다. 즉, 엑셀러레이터는 나타내십시오 동적임 캐스트 되돌려줍니다 null 포인터입니다. 따라서 런타임 시 편리하게 전환 여부를 확인하는 데 성공했다.


MyBase  *base = new MyBase();
MyChild *child = dynamic_cast(base);

if (child == 0) 
std::cout 
해설 (3)

C++ 프로그래밍/타입 캐스팅]1* 문서를 참조하세요.

여기에는 다양한 형변환 유형에 대한 좋은 설명이 포함되어 있습니다. 다음은 위 링크에서 가져온 것입니다:

const_cast

const_cast(표현식) const_cast()는 표현식의 변수의 const(ness)(또는 휘발성)을 추가/제거하는 데 사용됩니다.

static_cast

static_cast(표현식) static_cast()는 다음 사이에서 캐스팅하는 데 사용됩니다. 정수 유형 사이를 캐스팅하는 데 사용됩니다. '예: char-' long, int-' short 등.

정적 형변환은 관련 유형에 대한 포인터를 캐스팅하는 데에도 사용됩니다. 예를 들어 공백 *을 적절한 유형으로 캐스팅합니다.

동적_캐스트

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

동적_캐스트 대상 유형 대상 타입은 포인터 또는 참조 타입이어야 하며, 표현식은 표현식은 포인터 또는 참조로 평가되어야 합니다. 동적 형변환 작동 표현식이 참조하는 객체 유형이 다음과 같은 경우에만 작동합니다. 대상 유형과 호환되고 기본 클래스에 하나 이상의 가상 멤버 함수가 하나 이상 있는 경우에만 작동합니다. 그렇지 않은 경우, 형 변환되는 표현식의 유형은 가 포인터이고 참조에 대한 동적 형변환이 실패하면 NULL이 반환됩니다. 실패하면 bad_cast 예외가 발생합니다. 실패하지 않으면, 동적 형 변환은 객체에 대한 대상 유형의 포인터 또는 참조를 반환합니다. 객체에 대한 대상 유형의 포인터 또는 참조를 반환합니다.

재정의_캐스트

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

해설 (0)

사용하지 않는 c 스타일 방송.

39 는 상수 c 스타일 방송 및 재해석을 함께 캐스팅, it& 코드에서, s 찾기와 바꾸기 어렵다. C++ 응용 프로그램 프로그래머용 피할 수 있는 c 스타일 "라고 언급했다.

해설 (0)

비야네 스트롭스트룹 fyi, I believe 는 피할 수 있는 c 스타일 방송 등은 콩지름에 static_cast, 그리고 그 인용 또는 dynamic_cast 가능하면.

# 39 의 c++컴파일러는 반 Stroustrup& 스타일입니까 FAQ

시행하십시오 뭐하러요 조언을 하는 것입니다. # 39 m 되는 지주요 c++컴파일러는 i& 거리가 멀다.

해설 (1)

C 스타일 형변환은 const_cast, static_cast, reinterpret_cast를 통합합니다.

C++에 C 스타일 형변환이 없었으면 좋겠습니다. C++ 형변환은 제대로 눈에 띄고(형변환은 일반적으로 나쁜 일을 한다는 것을 나타냅니다) 형변환이 수행하는 다양한 종류의 변환을 적절히 구분합니다. 또한 boost::lexical_cast와 같이 비슷해 보이는 함수를 작성할 수 있어 일관성 측면에서 매우 좋습니다.

해설 (0)

동적_캐스트는 런타임 형 검사 기능이 있으며 참조 및 포인터에서만 작동하는 반면,정적_캐스트`는 런타임 형 검사를 제공하지 않습니다. 자세한 내용은 MSDN 문서 static_cast 연산자를 참조하세요.

해설 (0)

'' 만을 지원하는 참조 포인터, dynamic_cast 추상형데이터타입. 이 경우 'NULL' 되돌려줍니다 캐스트 불가능한 경우 예외를 던지는 경우 유형 또는 타입 () 은 포인터입니다 참조입니다 유형:. 이에 따라 ',' dynamic_cast 사용할 수 있는 특정 유형의 static_cast 객체인지 여부를 확인할 수 없는 ',' (간단히 끝날 수 있습니다 잘못된 값을 가진).

그동안 방송 c 스타일 (다른) 에서 다루는 다른 분입니다.

해설 (1)