c + + 형식 변환

원본 링크:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html
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); //              

좋은 웹페이지 즐겨찾기