프로그래밍/c++

캐스팅 4가지(타입변환)

오늘의논리 2023. 3. 1. 12:05
728x90
  1. static_cast
  2. dynamic_cast
  3. const_cast
  4. reinterpret_cast

 

 

* static_ cast : 타입 원칙에 비춰볼 상식적인 캐스팅만 허용해준다

  • int < - > float   3 < - > 3.0
  • Player* -> Knight* (다운 캐스팅) << , 안정성 보장 못함
int hp = 100;
int maxHp = 200;
float ratio = static_cast<float>(hp) / maxHp;

Player* p = new Knight();
Knight* k1 = static_cast<Knight*>(p);

 

*dynamic_cast : 상속 관계에서의 안전 형변환

  • RTTI ( RunTime Type Information)
  • 다형성을 활용하는 방식
  • virtual 함수를 하나라도 만들면, 객체의 메모리에 가상함수테이블(vftable) 주소가 기입된다
  • 만약 잘못된 타입으로 캐스팅을 했으면, nullptr 반환 !!***
  • 이를 이용해서 맞는 타입으로 캐스팅을 했는지 확인할때 유용하다
Knight* k2 = dynamic_cast<Knight*>(p);

 

*const_cast : const 붙이거나 떼거나 할때 사용

void PrintName(char* str)
{
    cout << str <<endl;
}

int main()
{        
    PrintName(const_cast<char*>("NoNri"));
    
    return 0;
}

 

*reinterpret_cast : 가장 위험하고 강력한 형태의 캐스팅

  • 포인터랑 전혀 관계없는 다른 타입 변환 등, 전혀 관계없는 클래스와의 변환도 됨
int main()
{        
    Knight* k2;
    
    __int64 address = reinterpret_cast<__int64>k2;
    
    void* p = malloc(1000);
    Player* P1 = reinterpret_cast<Player*>(p);

    return 0;
}
728x90