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 달리 변환 시 런타임 검사 없습니다pbstatic_cast. pb가 가리키는 개체는 유형 D의 개체가 아닐 수 있으며, 이 경우 *pd2를 사용하는 것은 매우 위험합니다. 예를 들어 D 클래스가 아닌 B 클래스의 멤버인 함수를 호출하면 액세스 위반이 발생할 수 있습니다.

dynamic_caststatic_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);
}

pbD 형식의 개체를 가리킬 경우 pd1pd2는 동일한 값을 얻습니다. 또한 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 대체합니다.

참고 항목

캐스팅 연산자
키워드