코가손의 블로그

C++ 캐스팅(static_cast, dynamic_cast, const_cast, reinterpret_cast) 본문

C++/문법

C++ 캐스팅(static_cast, dynamic_cast, const_cast, reinterpret_cast)

Cogason 2021. 11. 11. 12:40

static cast

"상식적인" 캐스팅만 허용

 

상식적인 : int <-> float, Player* -> Knight*(다운 캐스팅)

int hp = 100;
int maxHp = 200;
float ratio = static_cast<float>(hp / maxHp);

Player* p  = new Knight();
Knight* k = static_cast<Knight*>(p);

 

dynamic cast

상속 관계에서의 안전한 형변환, 다형성을 활용한 방식

 

RTTI(Runtime Type Information)

- Runtime에서 관리하는 정보, vftable, 실시간으로 동작할 때 타입을 확인할 수 있는 기법

- dynamic cast를 이용하고 싶으면 virtual 함수가 있어야 한다.

 

class Player
{
public:
    virtual ~Player() {}
}

class Knight : public Player
{
public:
}

class Archer : public Player
{
public:
}

int main()
{
    Player* p = new Archer();
    
    Knight* k1 = static_cast<Knight*>(p);
    // p는 Archer를 포인팅하고 있기 때문에 잘못된 캐스팅이 일어났음
    
    Knight* k = dynamic_cast<Knight*>(p);
    // virtual함수를 하나라도 만들면, 객체의 메모리에 가상함수 테이블(vftable) 주소가 기입
    // 가상테이블에 기입 되어 있는 타입을 확인할 수 있으니
    // 잘못된 타입으로 캐스팅 했다면 nullptr을 반환함
    
}

 

const cast

const를 붙이거나 땔 때 활용

공식 라이브러리에서 지원한 함수를 사용해야하는데 const일 때 주로 사용

 

reinterpret cast

형태를 다시 캐스팅하는 가장 위험한 캐스팅

전혀 관계없는 다른 타입으로 변환 등에 활용함

'C++ > 문법' 카테고리의 다른 글

C++ 중괄호 초기화 {}  (0) 2021.11.11
C++ 콜백 함수  (0) 2021.11.11
C++ 문자와 문자열  (0) 2021.11.11
C++ 동적 할당  (0) 2021.11.11
C++ 연산자 오버로딩  (0) 2021.11.11
Comments