프로그래밍/c++
캐스팅 4가지(타입변환)
오늘의논리
2023. 3. 1. 12:05
728x90
- static_cast
- dynamic_cast
- const_cast
- 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