>  기사  >  백엔드 개발  >  C++_Basic 사용 및 사용 시나리오의 네 가지 유형의 캐스트

C++_Basic 사용 및 사용 시나리오의 네 가지 유형의 캐스트

php是最好的语言
php是最好的语言원래의
2018-08-01 14:20:393570검색

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++ 的强制类型转换

【c#教程】C# 类型转换

相关视频:

PHP数据类型转换之自动类型转换

위 내용은 C++_Basic 사용 및 사용 시나리오의 네 가지 유형의 캐스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.