C++ cast들 (static_cast, reinterpret_cast, dynamic_cast, const_cast)

2023. 2. 9. 13:01Programming/JAVA, C++, Go, Rust

    목차
반응형

static_cast

static_cast는 C의 기본 cast와 동일합니다. 그렇다면 왜 static_cast를 사용해야 할까요? C의 기본 cast는 data type의 bit width를 무시합니다. 즉, 더 많은 bit를 사용하는 변수에서 더 적은 bit를 사용하는 변수로 casting을 하게되면 부족한 bit에 대한 값을 잃게되는 narrowing 문제가 발생합니다. C++의 static_cast를 사용하게되면 이런 문제를 예방 (compile 단계에서 오류 발생) 할 수 있습니다. 

 

static_cast는 다음과 같이 사용할 수 있습니다.

std::shared_ptr<int> sp(static_cast<int *>(malloc(sizeof(int))), free);

 

reinterpret_cast

type을 변환하는 cast를 지원합니다. 전혀 다른 타입으로 변환을 허용하는 cast 이기에 사실 사용을 하면 안되는 cast중 하나 입니다.

 

struct Item {
    int value;
    int type;
};


Item item = {1, 2};

int intval = reinterpret_cast<int>(item);

위와같은 casting을 허용합니다. legacy C 코드와 연동 기능을 구현할 때 void *로 임시로 변환하는 등의 경우에 사용할 수는 있겠습니다. 컴파일러마다 동작이 다르기에 이 역시 사용을 안하는 것이 좋습니다.

 

 

dynamic_cast

객체의 down casting을 위해서 사용합니다. 즉, base class가 아닌 derived class로 변환하고자 할 때 사용합니다. 

 

class Base {
    ...
};

class Derived1: public Base {
    ...
};


Base *base = new Derived1;

Derived1 *derived1_ptr = dynamic_cast<Derived1 *>(base);

cast에 실패할 경우 nuil pointer를 반환합니다.

 

 

const_cast

const_cast는 const 성 즉, 상수 변수를 상수가 아닌 변수로 casting 할 때 사용합니다. 또한 volatile의 속성도 제거하는데 사용됩니다.

 

const int value = 1;

int value2 = const_cast<int>(value);

 

반응형

'Programming > JAVA, C++, Go, Rust' 카테고리의 다른 글

Kotlin build on Mac  (0) 2023.02.27
C++ inline variable  (0) 2023.02.09
C++ emplace_back  (0) 2023.02.03
C++ 대입연산자의 virtual 사용  (0) 2023.01.29
미래지향적인 C++ 프로그래밍  (0) 2023.01.29