적절한 며칠입니까 사용합니다.
static_cast '-' dynamic_cast '-' const_cast '-' reinterpret_cast '-'
결정할 수 있는 구체적인 사례 사용하려면 어떻게 해야 할까요?
또한 'static_cast' 캐스트 상속을 통해 계층입니다. 이 때 위쪽 (위한 기본 클래스) 이지만, 불필요한 캐스팅 캐스팅을 아래쪽으로 때 사용할 수 있으며, 이를 통해 'virtual' 캐스트 deltamove doesn& t # 39 를 출력한다. 그러나 확인 및 it 가 정의되지 않는 않니다 비헤이비어를 static_cast, 실제로 있는 '유형' 계층으로 다운되어도 isn& # 39 는 객체의 타입은.
const_cast '도' 에 '휘발성' s # 39, 덜 흔한 표시되어도 that& 동작합니다.
',' 의 일부 한계에는 dynamic_cast 어쨌든요 이 경우, 여러 개의 동일한 유형의 객체에는 doesn& # 39 t 작동합니까 상속 계층 구조에서 (소위 # 39, & # 39 띄게 diamond&;) # 39 를 사용하여, t 'virtual' aren& 진실이며당신이 출력한다. 또한 공공 거쳐야 할 수 있을 것 '또는' 개인 '여행' 금지되었는지 상속 - 항상 실패를 통해 출력한다. 그러나 이것은 문제가 거의 같은 형태의 상속 드묾.
const_cast '-'
또한 다른 방송 할 수 있지만, 경우에 따라서 교체품을 활용될 수 있기 때문에 매우 위험한 '및' reinterpret_cast 를 양도하다 rmw 제공하십시오 복제본인지 확실하지 않으면 성공할 수 있을 때, 우선 명시성 캐스팅 요구되는가 static_cast '' 또는 'reinterpret_cast' 실패합니다. 그런데도 더 오래, 더 많은 것을 고려해보십시오 명시성 디바이스입니다.
C 스타일 '도' 즉, static_cast 경향성을 무시됨 액세스 제어 기능을 수행할 때 그들은 다른 작업을 수행할 수 없다는 것을. 이는 특히 클라우지 표시되어도, 그리고 제 마음이 그냥 피할 수 있는 또 다른 이유는 c 스타일 방송.
Dynamic_cast / 참조 포인터를 사용하여 변환하기 위한 '' 내 상속 계층.
'평범한' 를 사용하여 static_cast 유형 변환.
'비트' 를 사용하여 낮은 수준의 reinterpret_cast 강한 패턴입니다. 매우 신중하게 사용합니다.
'' 상수 '등을 사용하여 const_cast 캐스팅용 / 휘발성'. 이 API 를 사용하는 경우가 아니면 const 잘못된 피해야 한다.
다음은 , const_cast, dynamic_cast 할 때 사용되는 실용적인 참조용이므로 static_cast, reinterpret_cast .
(또한 이 이해할 수 있도록 참조하지만 엑스프레이나시옹: http://www.cplusplus.com/doc/tutorial/typecasting/)
OnEventData(void* pData)
{
......
// pData is a void* pData,
// EventData is a structure e.g.
// typedef struct _EventData {
// std::string id;
// std:: string remote_id;
// } EventData;
// On Some Situation a void pointer *pData
// has been static_casted as
// EventData* pointer
EventData *evtdata = static_cast<EventData*>(pData);
.....
}
void DebugLog::OnMessage(Message *msg)
{
static DebugMsgData *debug;
static XYZMsgData *xyz;
if(debug = dynamic_cast<DebugMsgData*>(msg->pdata)){
// debug message
}
else if(xyz = dynamic_cast<XYZMsgData*>(msg->pdata)){
// xyz message
}
else/* if( ... )*/{
// ...
}
}
// *Passwd declared as a const
const unsigned char *Passwd
// on some situation it require to remove its constness
const_cast<unsigned char*>(Passwd)
typedef unsigned short uint16;
// Read Bytes returns that 2 bytes got read.
bool ByteBuffer::ReadUInt16(uint16& val) {
return ReadBytes(reinterpret_cast<char*>(&val), 2);
}
이 내부 정보를 알고 있다면 조금 도움이 될 수 있다.
dynamic_cast *
런타임 타입 정보 - dynamic_cast 장비가 사용하는 경우 캐스트 유효합니다. 예를 들어, ' (기본 )' 을 ' (파생됨 )' 의 경우 실제로 포인터입니다 실패할 수 없는 파생됨 유형:.
이 는 대답을?
'왜' 를 사용한 적이 있으며, reinterpret_cast 를 필요로 하는 경우 표시할지를 isn& # 39 는 설계, 나쁜 냄새가 진동했다. 내가 일하는 많이유 dynamic_cast '에' 의 코드를 기반으로 사용됩니다. 'A' 와 '차이' 에서 확인할 수 있는 것은 static_cast dynamic_cast 런타임용으로 개발하십시오 (안전한) 또는 수 없습니다. (계속 오버헤드에) 처럼 그리웠댔지 (http://otl. [msdn] [2]).
[2]: 이아스파스 http://msdn.microsoft.com/en-us/library/c36yw7x9 (VS.80)
또 다른 예로 'static_cast, 슬라이드에서는 암시 적' 은 지금까지 답변이 불충분하다고 도왔으매 'reinterpret_cast' 가 필요합니다. 예를 들어 있는 출력 매개 함수 포인터를 객체에는 되돌려줍니다 좁히어 가 있는 서로 다른 클래스 (공통적으로 않는 기본 클래스). 이러한 기능은 실제 예를 ['코크리타인스턴스 ()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615%28v = vs. 85%29.aspx) (볼 수 있는 사실상 마지막 매개변수에서 'void '). 예를 들어, 특정 객체의 클래스를 요청한 이 기능을 통해 알 수 있도록 미리 유형에 대한 포인터 (할 수 있으며, 종종 COM 오브젝트를). 이 경우 void '을 (를)' 에 '캐스트 포인터입니다 delaymins 데이터베이스에구성원을 포인터입니다 static_cast': , (&, 유로파인터) ',' reinterpret_cast< void&g 합니다.
[코드:
#include <windows.h>
#include <netfw.h>
.....
INetFwPolicy2* pNetFwPolicy2 = nullptr;
HRESULT hr = CoCreateInstance(__uuidof(NetFwPolicy2), nullptr,
CLSCTX_INPROC_SERVER, __uuidof(INetFwPolicy2),
//static_cast<void**>(&pNetFwPolicy2) would give a compile error
reinterpret_cast<void**>(&pNetFwPolicy2) );
그러나 단순한 포인터 (필터링되지 가리키는 포인터) '는' static_cast, reinterpret_cast 피하기 위해 다시 쓰일 수 있으므로 위의 '코드' () 의 가격으로 추가 변수) 다음과 같은 방법으로:
#include <windows.h>
#include <netfw.h>
.....
INetFwPolicy2* pNetFwPolicy2 = nullptr;
void* tmp = nullptr;
HRESULT hr = CoCreateInstance(__uuidof(NetFwPolicy2), nullptr,
CLSCTX_INPROC_SERVER, __uuidof(INetFwPolicy2),
&tmp );
pNetFwPolicy2 = static_cast<INetFwPolicy2*>(tmp);
반면, 방송, 모든 차이를 c++컴파일러는 싶습니다 답변 아주 잘 설명됨 추가하기에서는 파선-짧은 참고 왜 c 스타일 방송 var '와' 유형 ' (형) 을 사용하면 안 됩니다 (var)'.
이 같은 작업을 통해 상위 솔루션 c++용 초보자 c 스타일 방송 중인 포착하십시오 c++컴파일러는 경향성 (static_cast<, >, (), dynamic_cast<, >, (), const_cast< > >;;; (), reinterpret_cast< ()) 을 통해 그 사람이 할 수 있는 c++컴파일러는 포지셔닝하십시오 다르게 구성된다. 사실 c 스타일 캐스트 상위 솔루션, 짧아진 쓸 수 있다.
C 스타일 캐스트 (cast) 의 의사를 도래하도록하려하는 그들은 숨기십시오 개발자 진짜 문제다. 일반적으로 c 스타일 방송 할 수 있는 거의 모든 유형의 캐스팅, 안전, () 에서 방송 및 dynamic_cast< () 를 통해 수행됨 static_cast< > >;;; (), 여기서 > const_cast< 잠재적으로 위험한 방송 같은 const 수정자의 제거할 수 있습니다. () 을 수정할 수 있으며, > reinterpret_cast< 수 있기 때문에 상수 변수 정수 값이 포인터를 재해석을 수도 있습니다.
다음은 분류했다.
int a=rand(); // Random number.
int* pa1=reinterpret_cast<int*>(a); // OK. Here developer clearly expressed he wanted to do this potentially dangerous operation.
int* pa2=static_cast<int*>(a); // Compiler error.
int* pa3=dynamic_cast<int*>(a); // Compiler error.
int* pa4=(int*) a; // OK. C-style cast can do such cast. The question is if it was intentional or developer just did some typo.
*pa4=5; // Program crashes.
주요한 이유는 c++컴파일러는 경향성을 자신의 의도를 명확히 할 수 있도록 :에서 추가된 것은 그가 왜 그렇게 - 개발자 예정이다 "라고 언급했다. C 스타일 방송 에서 사용할 수 있는 코드를 사용하여 완벽하게 틀렸다니까 c++컴파일러는 덜 판독값 등을 향상시키는 데 특히 t # 39, 개발자의 didn& 오류 발생 가능성이 높은 다른 코드를 만들 수 있습니다. 그래서 쉽게 읽을 수 있는 코드를 작성할 포지셔닝하십시오 c++컴파일러는 통해 방송 및 명시성 항상 c 스타일 방송.
이것은 파선-짧은 쿼트에 Stroustrup& # 39 에서 비얀 (저자의 c++컴파일러는) 의 책 C++ 프로그래밍 언어 4 에디션입니다 - 페이지 302.
>. 이 c 스타일 캐스트 보다 훨씬 더 위험한 release. 변환 연산자 이런 어려움 때문에 표기법에 의해 별색 큰 프로그램 및 변환 고안되었습니다 프로그래머용 명시성 않습니다.
struct Foo{};
struct Bar{};
int main(int argc, char** argv)
{
Foo* f = new Foo;
Bar* b1 = f; // (1)
Bar* b2 = static_cast<Bar*>(f); // (2)
Bar* b3 = dynamic_cast<Bar*>(f); // (3)
Bar* b4 = reinterpret_cast<Bar*>(f); // (4)
Bar* b5 = const_cast<Bar*>(f); // (5)
return 0;
}
컴파일 오류 없이 미디어만을 선 (4). 만 reinterpret_cast 포인터입니다 변환할지 사용할 수 있는 모든 개체를 포인터입니다 연관해제된 객체에는 유형:.
한 점에 주의해야 할 수 있다. 그러나 대부분의 컴파일러에도 dynamic_cast 런타임 시에 있는 실패할 수 없기 때문에 이 또한 가상 함수 포인터의 페일오버합니다 컴파일하십시오 구조체입니다 주조, dynamic_cast 기술입니까 마무리라뇨 협력합니다 국한됨 다형 클래스용 포인터를 가진다.
사용하는 경우 c++컴파일러는 캐스트 *: