c + + 형식 변환
C 스타일 의 강제 유형 전환 (Type Cast) 은 매우 간단 하 다. 어떤 유형의 전환 이 든 모두 TYPE b = (TYPE) a 이다.C + + 스타일 의 유형 전환 은 4 가지 유형 변환 조작 자 를 제공 하여 서로 다른 상황 에 대응 하 는 응용 을 제공 합 니 다.
const_cast, 말 그대로 const 속성 을 제거 하 는 것 입 니 다.static_cast, 이름 적 으로 정적 형식 변환 으로 이해 합 니 다.int 에서 char 로 변환 합 니 다.dynamic_cast, 이름 적 으로 동적 형식 변환 으로 이해 합 니 다.예 를 들 어 하위 클래스 와 부모 클래스 간 의 다 중 형식 전환.reinterpret_cast, 형식 만 재해 석 할 뿐 바 이 너 리 전환 은 하지 않 았 습 니 다.TYPE B = static 와 같은 4 가지 형식 변환 형식cast(TYPE)(a)。
const_cast 는 형식의 const 나 volatile 속성 을 제거 합 니 다.
struct SA {
int i;
};
const SA ra;
//ra.i = 10; // const ,
SA &rb = const_cast<SA&>(ra);
rb.i =10;
static_cast
C 스타일 과 유사 한 강제 전환.무조건 변환, 정적 형식 변환.사용: 1. 기본 클래스 와 하위 클래스 간 전환: 그 중에서 하위 포인터 가 부모 포인터 로 전환 하 는 것 이 안전 합 니 다.그러나 부모 지침 이 하위 지침 으로 바 뀌 는 것 은 안전 하지 않다.(기본 클래스 와 하위 클래스 간 의 동적 형식 변환 은 dynamic cast) 2. 기본 데이터 형식 으로 변환 하 는 것 을 권장 합 니 다.enum, struct, int, char, float 등.static_cast 는 유형 (예 를 들 어 비 기본 클래스 와 하위 클래스) 포인터 간 의 전환 을 할 수 없습니다.3. 빈 바늘 을 목표 유형의 빈 바늘 로 변환 합 니 다.4. 모든 종류의 표현 식 을 void 형식 으로 변환 합 니 다.5. static_cast 는 형식의 const, volitale 속성 을 제거 할 수 없습니다 (const cast 로).
int n = 6;
double d = static_cast<double>(n); //
int* pn =&n;
double* d = static_cast<double*>(&n) // ,
void* p = static_cast<void*>(pn); // void*
dynamic_cast 조건 부 변환, 동적 형식 변환, 실행 시 유형 보안 검사 (변환 실패 NULL 로 돌아 가기): 1. 안전 한 기본 클래스 와 하위 클래스 간 전환.2. 가상 함수 가 있어 야 합 니 다.3. 같은 기류 와 다른 부류 간 의 교차 전환.결 과 는 NULL.
class BaseClass {
public:
int m_iNum;
virtual void foo(){}; // 。 dynamic_cast
};
class DerivedClass: public BaseClass {
public:
char* m_szName[100];
void bar(){};
};
DerivedClass* pb =new DerivedClass();
BaseClass *pd1 = static_cast<BaseClass *>(pb); // -> , ,
BaseClass *pd2 = dynamic_cast<BaseClass *>(pb); // -> , ,
BaseClass* pb2 =new BaseClass();
DerivedClass *pd21 = static_cast<DerivedClass *>(pb2); // -> , , ! m_szName
DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2); // -> , , 。 NULL
reinterpret_cast
형식 만 재해 석 할 뿐 바 이 너 리 변환 은 하지 않 았 습 니 다.
1. 전환 하 는 유형 은 포인터, 인용, 산술 유형, 함수 포인터 또는 구성원 포인터 여야 합 니 다.
2. 비트 비트 비트 등급 에서 전환 합 니 다.그것 은 하나의 지침 을 하나의 정수 로 바 꿀 수도 있 고, 하나의 정 수 를 하나의 지침 으로 바 꿀 수도 있다.그러나 32bit 가 아 닌 인 스 턴 스 를 지침 으로 바 꿀 수 는 없다.
3. 가장 일반적인 용 도 는 함수 포인터 유형 간 에 전환 하 는 것 이다.
4. 이식 성 을 보장 하기 어렵다.
int doSomething(){
return 0;
};
typedef void(*FuncPtr)(); //FuncPtr , , void
FuncPtr funcPtrArray[10]; //10 FuncPtrs , ( ) funcPtrArray .
funcPtrArray[0] =&doSomething;// ! ,reinterpret_cast
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); //
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.