[C++] 📂. 타입변환(Casting)
1. static_cast
- https://docs.microsoft.com/ko-kr/cpp/cpp/static-cast-operator?view=msvc-170
- 상식적인 타입변환을 지원
- int ↔ float (정수형, 실수형 변환)
- Base* ↔ Derived* (
다운 캐스팅
, 상속관계 변환)
// 1.
int num = 20;
int maxNum = 300;
float ratio = static_cast<float>(num) / maxNum;
// 2.
Base* b = new Derived_A();
Derived_A* d_a = static_cast<Derived_A*>(b);
// ❗ 단점 : 안정성 보장 못함
Deribed_B* d_b = static_cast<Derived_B*>(b);
2. dynamic_cast
- https://docs.microsoft.com/ko-kr/cpp/cpp/dynamic-cast-operator?view=msvc-170
- RTTI(RunTime Type Information) → virtual이 있는 경우 사용
- virtual 함수를 하나라도 만들었으면, 객체 메모리에 가상함수 테이블 주소가 기입된다. 이 주소를 이용하여 캐스팅에 사용한다.
- 잘못된 타입으로 캐스팅 하면
nullptr
반환
class A {};
class B : public A {};
class C : public B {};
// 업 캐스트
C* c = new C();
B* b = dynamic_cast<B*>(c);
A* a = dynamic_cast<A*>(c);
class A {virtual void f();};
class B : public A {virtual void f();};
class C : public A {virtual void f();};
// 다운 캐스트
A* a = new B();
B* b = dynamic_cast<B*>(a);
C* c = dynamic_cast<C*>(a); // return nullptr
3. const_cast
- https://docs.microsoft.com/ko-kr/cpp/cpp/const-cast-operator?view=msvc-170
- 상수(const)를 붙이거나 제거할 때 사용
void PrintName(char* name) { cout << name << endl; }
PrintName(const_cast<char*>("2in9u"));
4. reinterpret_cast
- https://docs.microsoft.com/ko-kr/cpp/cpp/reinterpret-cast-operator?view=msvc-170
- 포인터와 전혀 관계 없는 다른 타입 변환
class A {};
class B {};
A* a = new A();
//
__int64 address = reinterpret_cast<__int64>(a);
//
B* b = reinterpret_cast<B*>(a);
//
void* p = malloc(1000);
B* bb = reinterpret_cast<B*>(p);
댓글남기기