static_cast 연산자
식에 있는 형식에만 따라 식을 type-id 형식으로 변환합니다.
구문
static_cast <type-id> ( expression )
설명
표준 C++에서는 변환의 안전성을 보장하기 위해 런타임 형식 검사가 수행되지 않습니다. C++/CX에서는 컴파일 시간 및 런타임 검사가 수행됩니다. 자세한 내용은 캐스팅에 정의된 인터페이스의 private C++ 관련 구현입니다.
연산자는 static_cast
포인터를 기본 클래스로 변환하여 파생 클래스에 대한 포인터로 변환하는 등의 작업에 사용할 수 있습니다. 이러한 변환이 항상 안전한 것은 아닙니다.
일반적으로 열거형과 같은 숫자 데이터 형식을 ints 또는 ints와 같은 숫자 데이터 형식을 부동 소수점으로 변환하려는 경우에 사용 static_cast
하며 변환과 관련된 데이터 형식이 확실합니다. static_cast
변환은 검사 런타임 형식 dynamic_cast
이 없기 때문에 static_cast
변환만큼 dynamic_cast
안전하지 않습니다. 모호한 포인터에 대한 A dynamic_cast
는 실패하고 static_cast
아무 것도 잘못되지 않은 것처럼 반환됩니다. 이것은 위험할 수 있습니다. 변환은 더 안전 dynamic_cast
하지만 dynamic_cast
포인터 또는 참조에서만 작동하며 런타임 형식 검사 오버헤드입니다. 자세한 내용은 dynamic_cast Operator를 참조 하세요.
다음에 나오는 예제에서 D* pd2 = static_cast<D*>(pb);
줄은 D
에서 B
에 있지 않은 필드와 메서드를 가질 수 있기 때문에 안전하지 않습니다. 그러나 B* pb2 = static_cast<B*>(pd);
는 항상 모든 D
를 포함하기 때문에 B
줄의 변환은 안전합니다.
// static_cast_Operator.cpp
// compile with: /LD
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields
// and methods that are not in B.
B* pb2 = static_cast<B*>(pd); // Safe conversion, D always
// contains all of B.
}
dynamic_cast 달리 변환 시 런타임 검사 없습니다pb
static_cast
. pb
가 가리키는 개체는 유형 D
의 개체가 아닐 수 있으며, 이 경우 *pd2
를 사용하는 것은 매우 위험합니다. 예를 들어 D
클래스가 아닌 B
클래스의 멤버인 함수를 호출하면 액세스 위반이 발생할 수 있습니다.
dynamic_cast
및 static_cast
연산자는 클래스 계층 전체에서 포인터를 이동합니다. 그러나 static_cast
캐스트 문에 제공된 정보에만 의존하므로 안전하지 않을 수 있습니다. 예시:
// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
pb
가 D
형식의 개체를 가리킬 경우 pd1
및 pd2
는 동일한 값을 얻습니다. 또한 pb == 0
일 경우 같은 값을 얻습니다.
전체 D
클래스 dynamic_cast
가 아닌 형식 B
의 개체를 가리키는 경우 pb
0을 반환할 만큼 충분히 알 수 있습니다. 그러나 static_cast
형식 D
의 개체를 가리키고 단순히 해당 개체 D
에 대한 포인터를 반환하는 pb
프로그래머의 어설션에 의존합니다.
따라서 static_cast
암시적 변환의 역방향을 수행할 수 있으며, 이 경우 결과가 정의되지 않습니다. 변환 결과가 안전한지 확인하기 위해 프로그래머에게 static_cast
맡깁니다.
이 동작은 클래스 형식 이외의 형식에도 적용됩니다. 예를 들어 int static_cast
에서 .로 변환하는 char
데 사용할 수 있습니다. 그러나 결과 char
에서 전체 int
값을 보유하기에 충분한 비트가 없을 수 있습니다. 다시 말하지만, 변환 결과가 안전한지 확인하기 위해 프로그래머에게 static_cast
맡깁니다.
연산자를 static_cast
사용하여 표준 변환 및 사용자 정의 변환을 비롯한 암시적 변환을 수행할 수도 있습니다. 예시:
// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
}
연산자는 static_cast
정수 값을 열거형 형식으로 명시적으로 변환할 수 있습니다. 정수 계열 형식의 값이 열거형 값 범위에 속하지 않으면 결과 열거형 값이 정의되지 않습니다.
static_cast
연산자는 null 포인터 값을 대상 형식의 null 포인터 값으로 변환합니다.
모든 식은 연산자가 void static_cast
형식으로 명시적으로 변환할 수 있습니다. 대상 void 형식은 선택적으로 , volatile
또는 __unaligned
특성을 포함할 const
수 있습니다.
연산자는 static_cast
, volatile
또는 __unaligned
특성을 캐스팅const
할 수 없습니다. 이러한 특성을 제거하는 방법에 대한 자세한 내용은 const_cast Operator를 참조하세요.
C++/CLI: 재배치된 가비지 수집 static_cast
기 위에 검사 없는 캐스트를 수행할 위험이 있으므로 올바르게 작동한다고 확신하는 경우에만 성능이 중요한 코드에 사용해야 합니다. 릴리스 모드에서 사용해야 static_cast
하는 경우 성공을 보장하기 위해 디버그 빌드의 safe_cast 대체합니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback을 참조하세요.
출시 예정: 2024년 내내 콘텐츠 피드백 메커니즘인 GitHub 문제를 단계적으로 폐지하고 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은다음에 대한 사용자 의견 제출 및 보기