[모던C++입문] 6.5 변환
- 📕 Book / 모던C++입문
- 2021. 8. 3.
6.5 변환
- C++에는 서로 다른 4가지의 형변환 연산자가 있다.
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
- C스타일 형변환도 지원하지만 C스타일 형변환은 사용하지 말자
기본 클래스와 파생 클래스 간의 변환
업 캐스팅
- 업 캐스팅(Up Casting)은 기본 클래스에서 파생 클래스로의 형변환은 모호함이 없으면 항상 가능하다.
struct A
{
int ma;
}
struct B : A { float mb; int fb() { return 3;} };
struct C : A { };
struct D : B, C { };
void f(A a) {};
void g(A& a) {};
void h(A* a) {};
int main
{
B b;
//모두 A타입 개체로 암시적 변환
f(b);
g(b);
h(&b);
D d;
A ad(d); //오류 모호함
A ad(B(d)); //d를 B로 명시적인 업캐스팅을 통해 모호함을 없앰
}
//또는 A를 가상클래스로 B와 C사이를 공유할 수 있음
struct B : virtual A {};
struct C : virtual A {};
다운 캐스팅
- 다운 캐스팅(Down Casting)은 포인터/레퍼런스를 서브타입의 포인터/레퍼런스로 변환을 뜻한다
- 다운 캐스팅에는 두가지 형태가 있다.
- 빠르고 안전하지 않은 static_cast
- 추가비용이 들지만 안전하며 다형성 타입에만 사용가능한 dynamic_cast
B *bbp = new B, *bdp = new D;
D* dbp = static_cast<D*>(bbp); // 잘못된 다운 캐스팅
D* ddp = static_cast<D*>(bdp); // 올바른 다운 캐스팅 (검사하지 않음)
D* dbp = dynamic_cast<D*>(bbp); // 오류 : D로 다운캐스팅 할 수 없다.
D* ddp = dynamic_cast<D*>(bdp); // 정상
크로스 캐스팅
- dynamic_cast 에는 B와 C의 파생클래스인 경우 B타입에서 C타입으로 형변환이 가능하다.
C* cdp = dynamic_cast<C*>(bdp); // 가능 B -> D 개체를 갖는 C
cdp = static_cast<C*>(bdp); //오류 슈퍼클래스도 아니고 서브 클래스도 아님
cdp = static_cast<C*>(static_cast<D*>(bdp)); //B -> D -> C
const_cast
- const_cast는 const나 volatile 특성을 추가하거나 제거한다
reinterpret_cast
- 개체의 메모리 위치를 가져온뒤 개체의 비트를 다른 타입인것 처럼 해석
- 애플리케이션의 이식성을 훼손하는 방법이다.
함수 스타일 변환
- 생성자를 사용해 값을 변환할 수 있다.
- 변환 연산자는 생성자보다 우선한다.
- 명시적 생성자나 변환 연산자에서는 암시적 변환이 동작하지 않는다.
암시적 변환
- T에서 T의 슈퍼타입, const T, volatile T로 변환
- T[N] 에서 T*로 변환
- 함수에서 함수포인터로 변환
- nullptr_t에서 T*로 변환
- 정수에서 더큰 정수로 변환
- 수치타입에서 다른 수치타입으로의 변환
반응형