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 에서 디버그 빌드 성공 여부를 확인 합니다.