>  기사  >  백엔드 개발  >  C++ 유형을 변환하는 방법

C++ 유형을 변환하는 방법

醉折花枝作酒筹
醉折花枝作酒筹원래의
2021-06-28 14:54:502646검색

메서드: 1. 비다형 유형의 변환에 사용되는 static_cast 2. 관련되지 않은 다른 유형으로 변환되는 reinterpret_cast, 변수의 const 속성을 삭제한 다음 할당 4. 클래스에 사용 상속 수준 간의 포인터 또는 참조 변환.

C++ 유형을 변환하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, C++17 버전, Dell G3 컴퓨터.

C++ 유형을 변환하는 방법

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);//无法转换,会报错
}

C++ 유형을 변환하는 방법

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 속성은 재할당에 편리합니다

C++ 유형을 변환하는 방법

컴파일 시간에 완료되며 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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