다음을 통해 공유


static_cast 연산자

변환에 식 형식에 형식 id를 식에 있는 형식에만 기반으로 합니다.

static_cast <type-id> ( expression ) 

설명

런타임 형식 검사 변환의 안전성을 보장 하려고 합니다.

static_cast 에 대 한 포인터를 기본 클래스와 파생된 클래스에 대 한 포인터를 변환 하는 등의 작업에 대 한 연산자를 사용할 수 있습니다.이러한 변환이 안전 하지 않습니다.

일반적 사용 static_cast 고 float, 정수 또는 정수 숫자 데이터 형식을 열거형으로 변환 하는 경우 특정 데이터 형식 변환에 관련 된.static_cast변환으로 안전 하지 않습니다 dynamic_cast 변환 하기 때문에 static_cast 없이 런타임 유형 검사 하지, 하는 동안 dynamic_cast 하지.A dynamic_cast 대 모호한 포인터를 실패 하는 동안는 static_cast 아무것도 잘못 된; 처럼 반환 위험할 수 있습니다.하지만 dynamic_cast 변환 되어 안전 하 게, dynamic_cast 포인터 또는 참조 및 런타임 형식 검사의 오버 헤드입니다만.자세한 내용은 dynamic_cast 연산자를 참조하십시오.

줄 다음 예제에서 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, 없음 런타임 검사가 수행의 static_cast 변환 하는 pb.가리키는 개체에 의해 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.

경우 pb 유형의 개체를 가리키는 B 및 완전 한 수 없습니다 D 클래스, 다음 dynamic_cast 반환 합니다 충분히 이해 하 게 됩니다.그러나 static_cast 프로그래머의 설정에 사용 하는 pb 유형의 개체를 가리키는 D 단순히 것에 대 한 포인터를 반환 하 고 D 개체입니다.

따라서, static_cast 암시적 변환의 역변환을 수행할 수 있습니다, 있는 경우에 결과가 정의 되지 않습니다.결과를 확인 하려면 프로그래머에 남아 있는 static_cast 변환 되어 안전 합니다.

이 동작은 클래스 형식 이외의 형식에도 적용 됩니다.예를 들어, static_cast 을 int로 변환 하는 데 사용할 수 있는 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 형식을 포함할 수 있습니다 (선택 사항)를 const, volatile, 또는 __unaligned 특성입니다.

static_cast 연산자 떨어져 캐스팅할 수 없습니다의 const, volatile, 또는 __unaligned 특성입니다.참조 하십시오 const_cast 연산자 이러한 특성을 제거 하는 방법에 대 한.

Relocating 가비지 수집기를 사용 하는 맨 위에 검사 되지 않은 캐스트를 수행 하는 위험 때문에 static_cast 제대로 작동 할 때 성능이 중요 한 코드에만 있어야 합니다.사용 해야 하는 경우 static_cast 릴리스 모드에서 대체할 safe_cast 에서 디버그 빌드 성공 여부를 확인 합니다.

참고 항목

참조

캐스팅 연산자

C + + 키워드