#31. 캐스팅(형변환)
형변환은 일반적으로 C언어 스타일의 형변환이 있다.
기존에 알듯이 3.f나 (float)3.14와 같은것들이다
아래는 C++형식의 형변환이며 좀 더 안정적인 사용이 가능하다.
#static_cast
논리적 캐스팅
-> 캐스팅 시점이 컴파일 시점이기 때문에(static) C스타일의 캐스팅과 다른점이 없다.
CParents* AA = new CChild;
일때
AA는 CParents타입 이기 때문에 CChild의 함수를 불러올 수 없다.
하지만 static_cast를 통해 부를 수 있다.
static_cast<CChild*>(AA)->Child_Func();
과 같은 형식을 사용한다.
->static_cast를 사용할 때 상속 관계는 따지지만 부모 자식의 관계는 확인하지 않기 때문에,
자식형식으로 되어있는 자료형도 static_cast를 통해 부모형식으로 바꾸어 줄 때 오류가 발생하지 않는다.
#dynamic_cast
->캐스팅 시점이 런타임 시점이기 때문에 비교적 안전하다.
런타임 시점에 실 객체가 누구인지 판단하여 캐스팅 여부를 결정한다.
이때 캐스팅이 정상일 경우 주소값을 반환하고, 비정상일 경우 nullptr을 반환한다.
따라서 if문을 사용하여 다음과 같이 안전하게 사용할 수 있다.
if(!dynamic_cast<CChild*>(AA))
dynamic_cast<CChild*>(AA)->CChild_Func();
주의점 및 단점
1. 일반 포인터가 아닌 객체포인터 대상으로만 형변환을 수행 할 수 있다.
2. virtual 키워드가 단 하나라도 있는 상속관계에서만 캐스팅이 가능하다.
3. 안정성이 좋은 대신 속도가 많이 느리다.
#const_cast
const_cast는 데이터에 상수성을 제거 및 부여할 때 사용한다.
#reinterpret_cast
static_cast로는 바꾸지 못하는 포인터형 형변환을 위해 존재하는 연산자가 reinterpret_cast이다.
위의 두가지는 잘 사용되지 않는다.