static_cast 연산자
expression을 현재 식에 있는 형식에만 기반한 type-id, 형식으로 변환합니다.
static_cast <type-id> ( expression )
설명
표준 C++에서는 변환의 안전성을 보장하기 위해 런타임 형식 검사가 수행되지 않습니다. C++/CX에서는 컴파일 시간 및 런타임 검사가 수행됩니다. 자세한 내용은 캐스팅(C++/CX)을 참조하십시오.
static_cast 연산자는 기본 클래스에 대한 포인터에서 파생된 클래스에 대한 포인터로의 변환과 같은 연산에 사용할 수 있습니다. 이러한 변환이 항상 안전한 것은 아닙니다.
일반적으로 열거형을 정수로 또는 정수를 부동 수로 변환하는 경우와 같이 숫자 데이터 형식을 변환할 때 변환에 사용할 데이터 형식을 확실히 아는 경우 static_cast를 사용합니다. static_cast는 dynamic_cast와 달리 런타임 형식 검사를 수행하지 않으므로 static_cast 변환은 dynamic_cast 변환만큼 안전하지 않습니다. 모호한 포인터에 대한 dynamic_cast는 실패하는 반면, static_cast는 잘못된 것이 없는 것처럼 반환합니다. 이는 위험할 수 있습니다. dynamic_cast 변환이 더욱 안전하기는 하지만 dynamic_cast는 포인터나 참조에서만 작동하며 런타임 형식 확인은 오버헤드입니다. 자세한 내용은 dynamic_cast 연산자을 참조하십시오.
다음에 나오는 예제에서 D* pd2 = static_cast<D*>(pb); 줄은 D에서 B에 있지 않은 필드와 메서드를 가질 수 있기 때문에 안전하지 않습니다. 그러나 D는 항상 모든 B를 포함하기 때문에 B* pb2 = static_cast<B*>(pd); 줄의 변환은 안전합니다.
// 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를 사용하는 것은 매우 위험합니다. 예를 들어 B 클래스가 아닌 D 클래스의 멤버인 함수를 호출하면 액세스 위반이 발생할 수 있습니다.
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일 경우 같은 값을 얻습니다.
pb가 완전한 D 클래스를 가리키지 않고 B 형식의 개체를 가리킬 경우 dynamic_cast는 0을 반환합니다. 그러나 static_cast는 프로그래머의 어설션에 사용되는 pb 형식의 개체인 D 형식을 가리키며 D 개체에 포인터를 반환합니다.
따라서 static_cast는 암시적 변환과 반대로 진행할 수 있습니다. 이 경우 결과는 정의되지 않습니다. 프로그래머는 static_cast 변환의 결과가 안전한지 확인해야 합니다.
이 동작은 클래스 형식 이외의 형식에도 적용됩니다. 예를 들어 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 포인터 값으로 변환합니다.
모든 식은 static_cast 연산자에 의해 void 형식으로 명시적으로 변환될 수 있습니다. 대상 void 형식은 선택적으로 const, volatile 또는 __unaligned 특성을 포함시킬 수 있습니다.
static_cast 연산자는 const, volatile 또는 __unaligned 특성과 떨어져 캐스팅할 수 없습니다. 이러한 특성을 제거하는 방법에 대한 자세한 내용은 const_cast 연산자를 참조하십시오.
재배치하는 가비지 컬렉션의 상단에서 확인되지 않은 캐스팅을 수행하는 위험으로 인해 올바르게 작동한다고 확신할 때만 성능에 중요한 코드에서만 static_cast를 사용해야 합니다. 릴리스 모드에서 static_cast를 사용해야 하는 경우 성공을 위해 디버그 빌드의 safe_cast로 대체합니다.