Brise

[C++ 기본] 10. Casting 본문

프로그램/C,C++

[C++ 기본] 10. Casting

naudhizb 2022. 1. 29. 22:04
반응형

C에서는 대부분의 캐스팅 연산을 사용자의 자유로 두고 있어 위험한 동작도 허용하는 경우가 많다.


// 10_캐스팅1.cpp    48 page
#include <iostream>

// C 캐스팅의 문제점
// 논리적으로 맞지 않고 위험한 경우도 대부분 성공한다.

// 그래서 C++은 4개의 캐스팅 연산을 제공한다.
int main()
{
    int n = 3;

//    double* p = &n; // C언어 : 경고, C++ : 에러

    double* p = (double*)&n; // C스타일 캐스팅

    *p = 3.4;
}
#include <iostream>

// static_cast : 논리적으로 맞고 위험하지 않은 경우만 허용
//          void*=> 다른 타입*,
//            상속관계의 캐스팅 등.
//          반드시 연관성이 있어야 한다


int main()
{
    double d = 3.4;
    int    n = d;

    //int* p1 = malloc(100);     // C언어 : ok. C++ : 에러
    //int* p1 = (int*)malloc(100); // ok

    // void* => 다른타입* 는 허용
    int* p1 = static_cast<int*>( malloc(100) ); // C++ 캐스팅


            
    //double* p2 = (double*)&n; // ok.
    double* p2 = static_cast<double*>(&n); // error


    const int c = 10;
    //int* p3 = (int*)&c; // ok
    int* p3 = static_cast<int*>(&c); // error.
}

//strict_cast(data) 구문의 경우 컴파일러가 안전하다고 생각하는 경우에만 가능하고 불완전한 캐스팅의 경우에는 컴파일러 단계에서 오류를 생성한다.

#include <iostream>

// reinterpret_cast : 포인터 <-> 포인터 변환(타입상관없음)
//                      포인터 <-> 정수 변환

int main()
{
    double d = 3.4;
    //int    n =  d; // ok
    int    n = reinterpret_cast<int>(d); // error

    //double* p2 = (double*)&n; // ok.
    //double* p2 = static_cast<double*>(&n); // error
    double* p2 = reinterpret_cast<double*>(&n); // ok

    // 주소 => 정수로 캐스팅  또는 정수를 주소로 캐스팅
    int x   = reinterpret_cast<int>(&n);  // ok
    int* p2 = reinterpret_cast<int*>(100);// ok
}

reinterpret_cast는 타입 간의 오류를 체크하지는 않는다.

// const_cast : 

int main()
{
    const int c = 10;

    int* p1 = &c;       // error
    int* p2 = (int*)&c; // ok
    int* p3 = static_cast<int*>(&c);      // error
    int* p4 = reinterpret_cast<int*>(&c); // error. 
                        // 상수성제거 안됨.

    int* p5 = const_cast<int*>(&c); // ok..
                        // 동일 타입의 const 속성 제거
}

const_cast는 data 영역의 const 구문을 무시한다.

int main()
{
    const int c = 10;

    // c의 주소를 double* 에 담고 싶습니다.
    // 방법 1. C 스타일 캐스팅
    double* p = (double*)&c;

    // 방법 2. C++ explicit 캐스팅(4개의 캐스팅) 활용
    double* p1 = reinterpret_cast<double*>(
                        const_cast<int*>(&c)); // 해보세요..
}

예를 들어 const int 값의 포인터를 이용하여 double *형 데이터에 넣고 싶다면 C언어의 방법을 사용하는 방법도 있지만, C++타입의 cast 명령 2개를 조합하여 사용하는 방법이 있다.

물론 안전상으로는 static_cast 사용이 권장되지만, 경우에 따라 다른 casting을 사용하여야 할 수도 있으니,,

반응형

'프로그램 > C,C++' 카테고리의 다른 글

[C++ 기본 2] 2. memory allocation  (0) 2022.01.29
[C++ 기본 2] 1. reference  (0) 2022.01.29
[C++ 기본] 11. nullptr  (0) 2022.01.29
[C++ 기본] 9. 제어문  (0) 2022.01.29
[C++ 기본] 8. 반복문  (0) 2022.01.29
[C++ 기본] 7. template function  (0) 2022.01.16
[C++ 기본] 6. Function  (0) 2022.01.15
Comments