집 >백엔드 개발 >C#.Net 튜토리얼 >C++_Basic 사용 및 사용 시나리오의 네 가지 유형의 캐스트
C에서의 유형 변환:
처음부터 시작해야 합니다. C 언어는 강력하고 단순하기 때문에 C와 유사한 유형 변환을 사용하는 데 익숙합니다.
주로 두 가지 형식이 있습니다.
(new-type) 표현식
new-type (expression)
C 스타일 변환 형식은 매우 간단하지만 많은 단점이 있습니다:
1. 변환이 너무 무작위적이고 어디서나 수행할 수 있습니다. 유형 간 변환. const 개체에 대한 포인터를 const가 아닌 개체에 대한 포인터로 변환하고, 기본 클래스 개체에 대한 포인터를 파생 클래스 개체에 대한 포인터로 변환할 수 있습니다. 이러한 변환 간의 차이는 매우 크지만 기존 C 언어에서는 그렇습니다. -style 캐스트는 이들을 구별하지 않습니다.
2.C 스타일 변환에는 통일된 키워드와 식별자가 없습니다. 대규모 시스템의 경우 코드 문제 해결을 수행할 때 놓치거나 무시하기 쉽습니다.
C++의 유형 변환:
C++ 스타일은 위의 두 가지 문제를 완벽하게 해결합니다. 1. 유형 변환은 세분화되어 있으며 서로 다른 요구 사항에 따른 변환을 지원하기 위해 4가지 유형의 변환이 제공됩니다. 2. 유형 변환에는 통합 식별자가 있어 코드 문제 해결 및 검사에 편리합니다. 아래에는 네 가지 변환이 소개되어 있습니다: static_cast, Dynamic_cast, const_cast 및 reinterpreter_cast.
static_cast, 이름 지정은 정적 유형 변환으로 이해됩니다. int를 char로 변환하는 것과 같습니다.
dynamic_cast, 명명은 동적 유형 변환으로 이해됩니다. 하위 클래스와 상위 클래스 간의 다형성 유형 변환과 같은 것입니다.
const_cast는 문자 그대로 const 속성을 제거하는 것을 의미합니다.
reinterpreter_cast는 유형을 재해석만 하고 이진 변환을 수행하지 않습니다.
1. static_cast 변환
1. 기본 사용법 : static_cast 표현식
2. 사용 시나리오 :
a. 클래스 계층 구조에서 기본 클래스와 파생 클래스 간의 포인터 또는 참조에 사용됩니다. 변환
상향 변환(파생 클래스 --> 기본 클래스)은 안전합니다.
하향 변환(기본 클래스 --> 파생 클래스)은 동적 유형 검사가 없기 때문에 안전하지 않습니다.
b. int를 char로 변환하는 등 기본 데이터 유형 간 변환에 사용됩니다. 이는 보안 문제를 가져오며 프로그래머가 이를 보장해야 합니다
c. 널 포인터를 대상 유형의 널 포인터로 변환합니다. 모든 유형의 표현식을 무효화합니다
3.
사용 특징a. 주로 비다형성 변환 작업을 수행하며 C
에서 일반적인 변환 작업을 대체하는 데 사용됩니다. 암시적 변환을 권장합니다. b.
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类型2. Dynamic_cast 변환
1.
기본 사용법: Dynamic_cast 표현식 2.
사용 시나리오: 파생 클래스 간 변환 시에만 Dynamic_cast 사용, type-id 클래스 포인터, 클래스 참조 또는 무효의*. 3.
사용 특징: a.dynamic_cast는 런타임 유형 확인이고 런타임 유형 정보가 필요하며 이 정보는 클래스의 가상 함수 테이블에 저장되므로 기본 클래스에는 가상 함수가 있어야 합니다. 클래스가 가상 함수를 정의하는 경우에만 가상 함수 테이블을 갖게 됩니다(클래스에 가상 함수가 없으면 일반적으로 이 클래스의 디자이너는 해당 클래스가 기본 클래스가 되는 것을 원하지 않습니다).
b 하향 변환의 경우 Dynamic_cast는 안전하지만(유형이 일치하지 않는 경우 변환된 포인터는 널 포인터입니다) static_cast는 안전하지 않습니다(유형이 일치하지 않는 경우 변환된 포인터는 잘못된 의미를 갖는 포인터입니다). 메모리, 불법 액세스 및 기타 문제가 발생할 수 있습니다.)
c. Dynamic_cast는 교차 변환도 수행할 수 있습니다
class BaseClass {public: int m_iNum; virtual void foo(){};//基类必须有虚函数。保持多台特性才能使用dynamic_cast};class DerivedClass: public BaseClass {public: char *m_szName[100]; void bar(){}; }; BaseClass* pb = new DerivedClass(); DerivedClass *pd1 = static_cast<DerivedClass *>(pb);//子类->父类,静态类型转换,正确但不推荐DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb);//子类->父类,动态类型转换,正确BaseClass* pb2 = new BaseClass();//父类->子类,静态类型转换,危险!访问子类m_szName成员越界DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);//父类->子类,动态类型转换,安全的。结果是NULLDerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);3, const_cast 변환
1.
기본 사용법: const_castexpression 2.
사용 시나리오a, 상수 포인터는 non-const 포인터로 변환되고 여전히 원래 객체를 가리킵니다.
b. 상수 참조는 non-const 참조로 변환되고 여전히 원래 객체를 가리킵니다.
3.
사용 특징: a. cosnt_cast는 4개입니다. 형 변환 연산자 중에서 상수에 대해 연산이 가능한 유일한 변환 연산자입니다.
b. constness를 제거하는 것은 위험한 작업이므로 사용하지 마십시오. 구체적인 시나리오는 다음과 같습니다. 클래스가 const를 통해 오버로딩을 제공할 때 비-const 함수는 일반적으로 const_cast를 호출하여 매개변수를 상수로 변환한 다음 상수 함수를 호출하고 결과를 가져온 다음 const_cast를 호출하여 불변성을 제거합니다.
struct SA { int i; };const SA ra;//ra.i = 10; //直接修改const类型,编译错误SA &rb = const_cast<SA&>(ra); rb.i = 10;4. reinterpret_cast 변환
1.
기본 사용법: reinterpret_castexpression 2.
사용 시나리오: 이 변환 문자를 최후의 수단, 고위험 작업으로 사용하지 마세요 3.
Us 연령 특징: a. reinterpret_cast는 하위 레이어의 데이터를 재해석하고, 특정 플랫폼에 따라 다르며, 이식성이 좋지 않습니다.
b. reinterpret_cast는 정수를 포인터로 변환하거나 포인터를 배열로 변환할 수 있습니다.
c. 따옴표 속 파렴치한 전환
int doSomething(){return 0;};//FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 voidtypedef void(*FuncPtr)();//10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存//入funcPtrArray数组:FuncPtr funcPtrArray[10]; funcPtrArray[0] = &doSomething;// 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArrayfuncPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//不同函数指针类型之间进行转换
总结:
去const属性用const_cast。
基本类型转换用static_cast。
多态类之间的类型转换用daynamic_cast。
不同类型的指针类型转换用reinterpreter_cast。
相关文章:
相关视频:
위 내용은 C++_Basic 사용 및 사용 시나리오의 네 가지 유형의 캐스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!