C, C++

static_cast, const_cast, reinterpret_cast

슬픈달 2019. 1. 23. 09:23
반응형

static_cast

 

일반적으로 C/C++ 언어에서는 지정한 데이터형으로 강제 형변환(casting)이 가능하다.

하지만 강제 형변환을 할 경우 원하지 않는 결과가 발생할 수 있으므로, 이런 문제를 미연에 방지하기 위해

static_cast를 사용하며, static_cast는 의미 없는 포인터의 형변환을 막아 준다. 사용 예는 다음과 같다.

 

#include <stdio.h>

#include <typeinfo>

 

class T1
{
public:
    virtual void print1() { puts( "t1p1" ); }
};


class T2 : public T1
{
public:
    virtual void print1() { puts( "t2p1" ); }
    virtual void print2() { puts( "t2p2" ); }
};


void main()
{
    T1 *t1 = new T1;
    T2 *t2 = new T2;
    T1 *t;

    t = (T1*)t1;      // C 언어 스타일의 형변환(casting), 컴파일 에러 없음

    t  = static_cast<T1*>(t1);    // C++ 스타일의 형변환(casting), 컴파일 에러 없음
    t  = static_cast<T1*>(t2);    // Up-casting, 컴파일 에러 없음
    t2 = static_cast<T2*>(t1);   // Down-casting, 컴파일 에러 없음

 

    int i, *pi;
    pi = (int*)&i;   // C 언어 스타일의 형변환, 컴파일 에러 없음
    pi = static_cast<int*>(&i);  // C++ 스타일의 형변환, 컴파일 에러 없음

 

    pi = (int*)t;      // C 스타일, 컴파일 에러 없음
    pi = static_cast<int*>(t);  // C++ 스타일, 컴파일 에러 발생
}

 

 

const_cast

 

상수형 포인터를 비상수형 포인터로 변경하고자 할 때 사용된다. 다음 예를 보자.

 

#include <stdio.h>
#include
<string.h>


void
main()
{
    char *pc;
    const char msg[] = "안눙~";
    pc = msg;    // 컴파일 에러 발생
    pc = const_cast<char*>(msg);  // 정상적으로 변환

    strcpy( pc, "hello" );
    puts( pc );

}

 

reinterpret_cast

 

이 연산자는 강제 형변환을 하기 위해 가끔 사용한다. 참고로 강제 형변환은 C 언어 형태를

사용해도 무방하다. 다음 예를 보자.

 

#include <stdio.h>
#include
<string.h>


void
main()
{
    struct node
    {
        char a, b, c, d;
    };

 

    int  ttt = 0x41424344;

    node* p1 = (node*)ttt;     // C 언어 스타일 형변환
    node* p2 = reinterpret_cast<node*>(ttt);  // C++ 스타일 형변환

}

반응형

'C, C++' 카테고리의 다른 글

1Byte를 2진수로 변경  (0) 2019.01.23
inet_addr, inet_ntoa  (0) 2019.01.23
클래스를 배열로(class - array)  (0) 2019.01.23
더블 포인터란 무엇인가? (double point)  (0) 2019.01.23
포인터와 const  (0) 2019.01.23