반응형

C 캐스팅의 문제점

  • 다른 데이터 타입의 포인터형으로 캐스팅이 가능
  • 캐스팅시 상수 주소를 비상수 포인터에 담을 수 있음
  • 이외 버그 가능성이 있는 캐스팅도 허용함
int main()
{
    int n = 3;
    double* p1 = (double*)&n; // 다른 데이터 타입 포인터로 캐스팅

    const int c = 10;
    int* p2 = (int*)& c; // 상수 주소를 비상수 포인터로 캐스팅
}

C++ 4가지 캐스팅

  • static_cast : 컴파일 타임 캐스팅
    • 가장 기본적인 캐스팅, 위험성을 내포한 경우는 캐스팅 안됨.
    • void* -> 다른타입*
  • reinterpret_cast : 컴파일 타임 캐스팅
    • 메모리의 재해석
    • 서로 다른 타입의 주소 캐스팅
    • 포인터와 정수간 캐스팅
  • const_cast : 컴파일 타임 캐스팅
    • 객체의 상수성을 제거하는 캐스팅
  • dynamic_cast : 실행시간 캐스팅
    • down cast 막기 위함
    • RTTI 기능
int main()
{
    int* p1 = static_cast<int*>(malloc(100)); // ok

    // 서로 다른 타입의 포인터로 캐스팅 필요시
    int n = 3;
    double* p2 = static_cast<double*>(&n); // error
    double* p2 = reinterpret_cast<double*>(&n); // ok

    // 상수를 비상수로 캐스팅 필요시
    const int c = 10;
    int* p3 = static_cast<int*>(&c); // error
    int* p3 = const_cast<int*>(&c); // ok
    
    // 응용
    double* p = (double*)&c; // 과거 C 스타일
    double* p = reinterpret_cast<double*>(const_cast<int*>(&c)); // 상수성 제거, 타입 호환
}
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 접근 지정자, 생성자, 소멸자  (0) 2019.05.06
C++ OOP(Object Oriented Programming)  (0) 2019.05.06
C++ reference 변수  (0) 2019.05.06
C++ new  (0) 2019.05.06
C++ 함수 특징 #2  (0) 2019.05.05

+ Recent posts