본문 바로가기
프로그래밍/C++

static_cast

by 코끼리_땃쥐 2023. 2. 14.

static_cast 형 변환 연산자는 다음의 형태를 갖는다.(dynamic_cast 연산자와 동일한 형태이다.)

static_cast<T>(expr)

그리고 static_cast 연산자를 사용하는 우리들에게 컴파일러는 다음과 같이 이야기한다.

 

"좋아 ! 요도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로뿐만 아니라, 기초 클래스의 포인터 및 참조형 데이터도 유도 클래스의 포인터 및 참조형 데이터로 아무런 조건 없이 형 변환시켜 줄게, 하지만 그에 대한 책임은 네가 져야해!"

#include <iostream>

class Car
{
private:
	int fuelGauge;
public:
	Car(int fuel) : fuelGauge(fuel)
    { }
	void ShowCarState() { std::cout << "잔여 연료량 : " << fuelGauge << std::endl; }
};

class Truck : public Car
{
private:
	int freightWeight;
public:
	Truck(int fuel, int weight) : Car(fuel), freightWeight(weight)
    { }
    void ShowTruckState()
    {
    	showCarState();
        std::cout << "화물의 무게 : " << freightWeight << std::endl;
    }
};

int main(void)
{
	Car * pcar1 = new Truck(80, 200);
    Truck * ptruck1 = static_cast<Truck*>(pcar1);
    ptruck1->ShowTruckState();
    std::cout << std::endl;
    
    Car * pcar2 = new Car(120);
    Truck * ptruck2 = static_cast<Truck*>(pcar2);
    ptruck2->ShowTruckState();
    return 0;
}

Truck * ptruck1 = static_cast<Truck*>(pcar1);

 

이 문장이 의미하는 바는 다음과 같다.

 

"포인터 pcar1을 Truck의 포인터형으로 변환 하겠습니다. 이건 제가 의도한것이 맞고요. 따라서 그에대한 책임도 제가 지겠습니다."

 

실제로 포인터 pcar1이 가리키는 객체가 Truck 객체가 이니 책임진다고 큰소리 칠만한 상황이다. 하지만 밑에 형 변환문을 살펴보면 

 

Truck * ptruck2 = static_cast<Truck*>(pcar2);

 

pcar2가 가리키는 대상은  Car객체이기 때문에, 이는 어떻게 해서든 정당화될 수 없는 상황이다. 따라서 이러한 형태로 문장을 구성하면 안된다.

 

실행 결과

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

dynamic_cast  (0) 2023.02.14
C++ 의 예외처리 메커니즘  (0) 2023.02.10
클래스 템플릿의 특수화  (4) 2023.02.09
C++ 배열 기반의 문자열 입 출력  (0) 2021.11.09
C++ 입력받기  (0) 2021.11.09

댓글