C++ Type Casting

C-style 형 변환은 상속 포인터의 형 변환 등 일반적이지 않은 형변환도 허용하기에 사용을 권하지 않는다

  • dynamic_cast<T>(expr): 상속 관계의 두 클래스에서 ‘유도 클래스의 포인터 및 참조형 데이터 to 기초 클래스의 포인터 및 참조형 데이터’ 변환에 사용

    • 묵시적으로 변환되기는 하나, 안전한 변환을 위하여 사용 추천
  • static_cast<T>(expr): 상속 관계의 두 클래스에서 ‘기초 클래스 to 유도 클래스’ 변환에 사용

    • 강제 형변환이 가능하지만 변환된 객체가 가지고 있지 않은 멤버에 대해서 프로그래머가 확실히 책임져야 한다
  • const_cast<T>(expr): 포인터와 참조자의 const / volatile 성향 제거

    • 함수의 인자 전달 시 const 선언으로 인해 발생하는 타입 불일치 발생으로 인한 인자 전달 불가에 유용하다

    • volatile: 하드웨어 제어 관련 상황에서 컴파일러의 최적화를 막아주는 키워드. 다만 사용 빈도는 매우 낮다

  • reinterpret_cast<T>(expr): 서로 전혀 상관없는 클래스의 포인터 관련 모든 유형의 형 변환 허용

    • 원하는 데이터의 비트 수준 접근 등 특정 상황에서는 유용하게 사용하지만, 크게 의미를 부여하기는 어렵다

  • 실체가 없는(null) 것을 가리키기 위하여 nullptr을 이용해 포인터를 null로서 초기화할 수 있다(기존 C의 NULL은 그냥 0을 의미)

  • 클래스형 객체의 배열을 동적으로 할당 가능하지만, 클래스에 기본 생성자가 존재해야 한다

  • 참조자(&)는 포인터(*)와 내부적인 구현은 동일하지만 포인터는 ‘주소(의 변수)‘이고, 참조자는 ‘객체(의 별명)‘임을 헷갈리지 말 것