집 >백엔드 개발 >C#.Net 튜토리얼 >C++ 유형을 변환하는 방법
메서드: 1. 비다형 유형의 변환에 사용되는 static_cast 2. 관련되지 않은 다른 유형으로 변환되는 reinterpret_cast, 변수의 const 속성을 삭제한 다음 할당 4. 클래스에 사용 상속 수준 간의 포인터 또는 참조 변환.
이 튜토리얼의 운영 환경: Windows 7 시스템, C++17 버전, Dell G3 컴퓨터.
C에서 유형 변환을 표준화하고 유형 변환의 가시성을 높이기 위해 C++에서는 네 가지 필수 유형 변환 연산자인 static_cast, reinterpret_cast, const_cast, Dynamic_cast를 도입했습니다.
이 연산자는 기본적으로 템플릿 클래스입니다.
다음은 별도로 소개됩니다.
1.static_cast
비다형성 유형의 변환(정적 변환)에 사용됩니다. C의 암시적 유형 변환에 해당하지만 두 가지 모두에 사용할 수는 없습니다. 정수와 정수 포인터 사이의 변환과 같은 관련 없는 유형의 변환입니다. 둘 다 4바이트이지만 하나는 데이터를 나타내고 다른 하나는 주소를 나타냅니다.
이 변환은 C 스타일 유형 변환과 유사하게 컴파일 타임에 완료되지만 다음 사항에 주의하십시오.파생 관계가 없는 두 클래스 유형 간에는 변환할 수 없습니다.원래 유형의 유형 수정자를 제거할 수 없습니다. , 예를 들어 const, 휘발성, __unaligned객체 변환 시 동적 유형 검사가 없기 때문에 기본 클래스 객체를 파생 클래스 객체로 변환할 때 보안 위험이 있습니다void Test() { //C中的方式 int i = 10; double d1 = i;//隐式类型转换 //int *p = i;//无法隐式类型转换,只能强制类型转换 int *p = (int*)i; //C++中的方式 double d2 = static_cast<double>(i); //相当于创建一个static_cast<double>类型的匿名对象赋值给d2 int* p2 = static_cast<int*>(i);//无法转换,会报错 }
2.reinterpret_cast
reinterpret의 의미 is 재해석은 한 유형을 관련 없는 다른 유형으로 변환할 수 있습니다.C의 강제 유형 변환에 해당하며, 암시적 변환을 수행할 수 없는 상황을 처리합니다.
void Test() { int i = 10; int* p2 = reinterpret_cast<int*>(i); }강제 유형 변환은 때때로 일부 문제를 격렬하게 처리할 수 있습니다.
다음 예:
매개변수가 있는 함수의 경우 매개변수를 전달하지 않고 어떻게 함수를 호출할 수 있나요?
void Fun(int s) { cout << s << endl; } typedef void(*FUNC)(); void Test() { FUNC pf = reinterpret_cast<FUNC>(Fun); pf(); }C에서의 캐스팅도 처리됩니다. 이 BUG 방법을 통해 함수 포인터를 변환하더라도 이러한 코드는 이식성이 없고 때로는 불확실한 결과를 생성하므로 이와 같이 사용하지 않는 것이 좋습니다. 예를 들어 여기서 s 출력 값은 하나의 Random 값이지만. 사용자가 외부 매개변수를 전달하지 않으면 함수가 호출될 때 형식 매개변수가 생성됩니다. 형식 매개변수는 초기화되지 않으며 자연스럽게 임의의 값입니다. 변수의 const 속성은 재할당에 편리합니다 컴파일 시간에 완료되며 const 및 휘발성 수정자를 제거하는 데 사용됩니다. 포인터 또는 참조만 변환할 수 있습니다
void Test3() { const int i = 10; int *p = const_cast<int*>(&i); *p = 20; cout << i << endl; cout << *p << endl; }
4. 클래스 상속 계층 간의 참조 변환. 이는 주로 "안전한 다운캐스팅"을 수행하는 데 사용됩니다. 즉, 기본 클래스 개체의 포인터나 참조를 동일한 상속 수준의 다른 포인터나 참조로 변환하는 것입니다.
"첫 번째 변환"(즉, 파생 클래스 포인터 또는 참조 유형이 기본 클래스 유형으로 변환됨)의 경우 변환에 Dynamic_cast를 사용할 수 있지만 반드시 필요한 것은 아닙니다. 변환은 이미 달성될 수 있습니다. 결국 Dynamic_cast를 사용하려면 오버헤드가 필요합니다.
class Base { public: Base(){}; virtual void Show(){cout<<"This is Base calss";} }; class Derived:public Base { public: Derived(){}; void Show(){cout<<"This is Derived class";} }; int main() { Base *base ; Derived *der = new Derived; //base = dynamic_cast<Base*>(der); //正确,但不必要。 base = der; //先上转换总是安全的 base->Show(); system("pause"); }
추천 튜토리얼: "C#
"
위 내용은 C++ 유형을 변환하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!