[모던C++입문] 6.5 변환

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*로 변환
  • 정수에서 더큰 정수로 변환
  • 수치타입에서 다른 수치타입으로의 변환
반응형

댓글

Designed by JB FACTORY