본문 바로가기
::public/C++

static_cast

by 해맑은욱 2020. 12. 11.

형 변환 시점이 컴파일 시점. c스타일의 캐스팅과 비슷한 역할.

상속 관계만 따질 뿐 부모와 자식의 관계는 따지지 않음.

 

#include <iostream>
 
using namespace std;
 
class ClassA {};
class ClassB {};
 
enum class TypeA
{
    A, B, C
};
 
enum class TypeB
{
    A, B, C
};
 
class Test
{
public:
    Test(int num) {}
    explicit Test(int num0, int num1) {}
 
    operator bool() const
    {
        return true;
    }
 
    explicit operator double() const
    {
        return 1.2;
    }
};
 
 
class Parent {};
class Child : public Parent {};
 
int main()
{
    // static_cast
    // 컴파일 타임 변환
    // 컴파일 타임에 호환 되지 않는 변환은 에러를 냄
 
    float f = 1.1f;
    int* i0 = (int*)&f; // 일반 C 스타일 캐스트는 된다
    //int* i1 = static_cast<int*>(&f); // 안 된다.
 
    ClassA a;
    ClassB* b = (ClassB*)&a; // 일반 C 스타일 캐스트는 된다.
    //ClassB* b = static_cast<ClassB*>(&a);  // 안 된다. 컴파일 타임에 오류를 잡아준다
 
    TypeA type0 = static_cast<TypeA>(0); // enum과 정수형은 호환이 되기 때문에 static_cast가 된다
    TypeB type1 = static_cast<TypeB>(type0); // enum 끼리 변환이 가능
 
    Test t0 = static_cast<Test>(1); // 변환 생성자
    Test t1 = static_cast<Test>(12); // 변환 생성자
 
    bool b0 = static_cast<bool>(t0);
    double d0 = static_cast<double>(t1);
 
    Child c;
    Parent& p0 = c;
    Child& c0 = static_cast<Child&>(p0); // Downcasting -> 부모를 자식으로 변환
    // 그렇지만 부모를 자식으로 캐스팅하는 것은 위험할 수 있음
 
    Parent p1;
    Child& c1 = static_cast<Child&>(p1); // 이 경우는 정의되지 않은 동작, Pointer를 통해 dynamic_cast 활용
}
cs

'::public > C++' 카테고리의 다른 글

dynamic_cast  (0) 2020.12.11
const_cast  (0) 2020.12.11
형 변환 규칙  (0) 2020.12.11
다중 상속  (0) 2020.11.27
private, protected 상속  (0) 2020.11.27