답변:
C ++ 스타일 캐스트는 컴파일러에서 확인합니다. C 스타일 캐스트는 런타임에 실패하고 실패 할 수 있습니다.
또한 c ++ 스타일 캐스트는 쉽게 검색 할 수 있지만 c 스타일 캐스트는 검색하기가 어렵습니다.
또 다른 큰 장점은 4 가지 C ++ 스타일 캐스트가 프로그래머의 의도를보다 명확하게 표현한다는 것입니다.
C ++을 작성할 때 C 스타일보다 항상 C ++을 사용합니다.
dynamic_cast
입니다.
(int)something
는 실패 할 수 없습니다 -int로 캐스트 되거나 컴파일러 오류가 발생합니다.
한마디로 :
static_cast<>()
컴파일 시간 검사 기능을 제공하지만 C 스타일 캐스트는 그렇지 않습니다.static_cast<>()
더 읽기 쉽고 C ++ 소스 코드의 어느 곳에서나 쉽게 찾을 수 있습니다. C_Style 캐스트는 없습니다.더 많은 설명 :
정적 캐스트는 호환 가능한 유형 간에 변환을 수행합니다 . C 스타일 캐스트와 비슷하지만 더 제한적입니다. 예를 들어 C 스타일 캐스트는 정수 포인터가 문자를 가리 키도록 허용합니다.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
이로 인해 1 바이트의 할당 된 메모리를 가리키는 4 바이트 포인터 (4 바이트 데이터 유형에 대한 포인터)가 생성되므로이 포인터에 쓰면 런타임 오류가 발생하거나 일부 인접한 메모리를 덮어 씁니다.
*p = 5; // run-time error: stack corruption
C 스타일 캐스트와 달리 정적 캐스트를 사용하면 컴파일러에서 포인터 및 포인트 데이터 유형이 호환되는지 확인할 수 있으므로 프로그래머가 컴파일 중에이 잘못된 포인터 할당을 잡을 수 있습니다.
int *q = static_cast<int*>(&c); // compile-time error
C ++ 캐스트에 대한 자세한 설명은이 페이지를 참조 하십시오. 여기를 클릭하십시오.
C ++ 캐스팅 연산자 비교를 참조하십시오 .
그러나 다양한 캐스팅 작업에 동일한 구문을 사용하면 프로그래머의 의도가 불분명해질 수 있습니다.
또한 큰 코드베이스에서 특정 유형의 캐스트를 찾기가 어려울 수 있습니다.
C 스타일 캐스트의 일반성은 필요한 모든 것이 간단한 변환 인 상황에서 과도 할 수 있습니다. 전력이 다른 여러 주조 작업자를 선택할 수 있으므로 프로그래머가 실수로 잘못된 유형으로 캐스팅하는 것을 방지 할 수 있습니다.
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
C / C ++의 다양한 캐스트와 C 스타일 캐스트가 실제로하는 일을 설명하는 훌륭한 게시물 : https://anteru.net/blog/2007/12/18/200/index.html
(유형) 변수 구문을 사용하는 C 스타일 캐스팅 최악의 발명품. 다음 순서로 캐스트를 시도합니다 (C ++ 표준, 5.4 expr.cast 단락 5 참조).
- const_cast
- static_cast
- static_cast 다음에 const_cast
- reinterpret_cast
- reinterpret_cast 다음에 const_cast
static_cast
컴파일 타임에 변환이 분명히 호환되지 않는 유형 사이에 있지 않은지 확인합니다. 반대로 dynamic_cast
런타임에 형식 호환성 검사가 수행되지 않습니다. 또한 static_cast
변환이 반드시 안전한 것은 아닙니다.
static_cast
포인터에서 기본 클래스로, 파생 클래스로의 포인터로, 또는 enum에서 int로 또는 float에서 int와 같은 기본 유형간에 변환하는 데 사용됩니다.
의 사용자 static_cast
는 변환이 안전한지 확인해야합니다.
C 스타일 캐스트는 컴파일 또는 런타임시 점검을 수행하지 않습니다.