static_cast <>와 C 스타일 캐스팅의 차이점은 무엇입니까?
static_cast<>
C 스타일 캐스팅보다 선호 할만한 이유가 있습니까? 그것들은 동등합니까? 속도 차이가 있습니까?
C ++ 스타일 캐스트는 컴파일러에서 확인합니다. C 스타일 캐스트는 런타임에 실패하고 실패 할 수 있음
또한 c ++ 스타일 캐스트는 쉽게 검색 할 수 있지만 c 스타일 캐스트는 검색하기가 어렵습니다.
또 다른 큰 장점은 4 가지 C ++ 스타일 캐스트가 프로그래머의 의도를보다 명확하게 표현한다는 것입니다.
C ++을 작성할 때 C 스타일보다 항상 C ++을 사용합니다.
한마디로 :
static_cast<>()
컴파일 시간 검사 기능을 제공하지만 C 스타일 캐스트는 그렇지 않습니다.static_cast<>()
더 읽기 쉽고 C ++ 소스 코드의 어느 곳에서나 쉽게 찾을 수 있습니다. C_Style 캐스트는 없습니다.- C ++ 캐스트를 사용하면 의도가 훨씬 더 잘 전달됩니다.
더 많은 설명 :
정적 캐스트는 호환 가능한 유형 간에 변환을 수행합니다 . 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!
}
static_cast
컴파일 타임에 변환이 분명히 호환되지 않는 유형 사이에 있지 않은지 확인합니다. 반대로 dynamic_cast
런타임에 형식 호환성 검사가 수행되지 않습니다. 또한 static_cast
변환이 반드시 안전한 것은 아닙니다.
static_cast
포인터에서 기본 클래스로, 파생 클래스로의 포인터로, 또는 enum에서 int로 또는 float에서 int와 같은 기본 유형간에 변환하는 데 사용됩니다.
의 사용자 static_cast
는 변환이 안전한지 확인해야합니다.
C 스타일 캐스트는 컴파일 또는 런타임시 점검을 수행하지 않습니다.
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
Since there are many different kinds of casting each with different semantics, static_cast<> allows you to say "I'm doing a legal conversion from one type to another" like from int to double. A plain C-style cast can mean a lot of things. Are you up/down casting? Are you reinterpreting a pointer?
'Programing' 카테고리의 다른 글
Java : System.exit ()를 호출하는 메소드를 테스트하는 방법? (0) | 2020.05.16 |
---|---|
두 세트의 교집합을 계산하는 방법은 무엇입니까? (0) | 2020.05.16 |
Lodash는 배열에서 중복 제거 (0) | 2020.05.16 |
값으로 배열 인덱스를 찾는 방법은 무엇입니까? (0) | 2020.05.16 |
어떤 기본의 정수를 문자열로 변환하는 방법? (0) | 2020.05.16 |