C++

<C++> static_cast

hanseongbugi 2024. 4. 3. 17:51

static_cast?

  • C++에서 제공하는 기능중 하나로 프로그래머가 형변환을 할 때 오류를 체크
  • 기본 형태
static_cast<바꾸려고 하는 타입>(대상);
static_cast<new_type>(expression)
  • 논리적으로 변환 가능한 타입을 변환
  • compile 타임에 형변환에 대한 타입 오류를 잡아준다.
  • 실수와 정수, 열거형과 정수형, 실수와 실수 사이의 변환 등을 허용
    • Array -> point로 변환이 가능
    • function -> function pointer로 변환이 가능
  • 포인터 타입을 다른 것으로 변환하는 것을 허용하지 않는다.
    • 단, 상속 관계에 있는 포인터 끼리는 변환이 가능
  • 바꾸려는 타입에는 void 형이 올 수 있지만 계산 후 제거된다.

일반 변수 간의 형변환

#include<iostream>
using namespace std;

int main(){
    double d = 13.24;
    float f = 10.12f;

    double d_temp;
    int i_temp;
    float f_temp;

    i_temp = static_cast<int>(d);
    cout<<"static_cast<int>(double) = "<<i_temp<<'\n';

    f_temp = static_cast<float>(d);
    cout<<"static_cast<float>(double) = "<<f_temp<<'\n';

    d_temp = static_cast<double>(f);
    cout<<"static_cast<double>(float) = "<<d_temp<<'\n';
}

// 결과
static_cast<int>(double) = 13
static_cast<float>(double) = 13.24
static_cast<double>(float) = 10.12

포인터 타입, 배열의 형변환

#include<iostream>
using namespace std;

int main(){
    int arr[10] = {11, 13, 15, 17, 19, 21, 23, 25, 27, 29};
    int *ptr;
    ptr = static_cast<int*>(arr);
    cout<<"1. int array -> int* : ";
    for(int i = 0;i<10;i++)
        cout<<ptr[i]<<' ';
    cout<<'\n';

    char str[] = "HanseongBugi";
    int *ptr2;
    // ptr2 = static_cast<int*>(str); // Compile Error
    // cout<<*ptr2<<'\n';

    int temp = 10;
    int *ptr3 = &temp;
    // char *c = static_cast<char*>(ptr3); // Compile Error
    // cout<<*ptr3<<'\n';
}

// 결과
1. int array -> int* : 11 13 15 17 19 21 23 25 27 29

열겨형(Enum) 형변환

#include<iostream>
using namespace std;

enum E_VAL {A=11, B, C};

int main(){
    E_VAL e = A;
    cout<<"E_VAL : "<<e<<'\n';

    int a;
    a = static_cast<int>(e);
    cout<<"1. static_cast<int>(enum) = "<<a<<'\n';

    int b;
    b = static_cast<int>(B);
    cout<<"2. static_cast<int>(enum) = "<<b<<'\n';

    E_VAL e2;
    e2 = static_cast<E_VAL>(13);
    cout<<"3. static_cast<enum>(int) = "<<e2<<'\n';
}

// 결과
E_VAL : 11
1. static_cast<int>(enum) = 11
2. static_cast<int>(enum) = 12
3. static_cast<enum>(int) = 13

상속관계에서의 형변환

#include<iostream>
using namespace std;

class Shape{
private:
    int a;
public:
    virtual void draw(){
        cout<<"Shape : called draw()"<<'\n';
    }
};

class Triangle : public Shape{
private:
    int b;
public:
    Triangle() : b(30){};
    void draw(){
        cout<<"Triangle : called draw()"<<'\n';
    }
    void onlyTriangle(){
        cout<<"Triangle : onlyTriangle()"<<'\n';
        cout<<b<<'\n';
    }
};

int main(){
    Shape *ps;
    Triangle t;
    ps = static_cast<Shape*>(&t);
    cout<<"1. upcasting"<<'\n';
    ps->draw();

    Shape s;
    Triangle *pt;
    cout<<"2. Downcasting"<<'\n';
    pt = static_cast<Triangle*>(&s);
    pt->draw();
    pt->onlyTriangle();
}

// 결과
1. upcasting
Triangle : called draw()
2. Downcasting
Shape : called draw()
Triangle : onlyTriangle()
1
  • Downcasting 시 부모 클래스의 인스턴스로 자식의 멤버 함수를 호출하는 것은 비 정상적인 결과를 초래할 수 있다.
    • 즉, 자식 클래스의 멤버 함수를 호출하면 예상 값과 다르게 나올 수 있다.
  • 결과를 보면 Triangle의 멤버 변수인 b의 값이 임의의 값으로 결정되어 출력되는 것을 볼 수 있다.

static_cast와 C스타일 캐스팅의 차이

  • 가장 큰 차이점은 static_cast의 경우 컴파일러가 캐스팅을 확인하며 C스타일 캐스팅의 경우 런타임 과정에서 에러가 발생하였는지 확인할 수 있다.
#include<iostream>
using namespace std;
 
int main(void)
{
    char a = 10;
    // int *p = static_cast<int*>(&a); // compile error
    int *p2 = (int*)&a;
    *p = 5; // runtime error
}
  • 보다 엄격(restrictive)함
    • 아래와 같이 포인터 형변환이 불가능하다.
    • 자료형 자체가 다르다보니 된다 한들 의미도 없다.
#include<iostream>
using namespace std;
 
int main(void)
{
    int n = 5, *p;
    double f = 3.14, *q;
    p = &n;
    // q = static_cast<double*>(&n); // compile error
}

 

 

 

출처

https://blockdmask.tistory.com/236

 

[C++] static_cast (타입캐스트 연산자)

안녕하세요 BlockDMask 입니다.오늘은 C++의 네가지 타입변환 연산자 static_cast, dynamic_cast, reinterpret_cast, const_cast 중 static_cast에 대해 알아보겠습니다. > static_cast 기본 형태 static_cast(대상); static_cast(exp

blockdmask.tistory.com

https://hwan-shell.tistory.com/211

 

C++] static_cast란??

모든 언어에는 형변환이 있습니다. C++에선 다양한 형번환 객체들을 제공합니다. 1. static_cast 2. dynamic_cast = https://hwan-shell.tistory.com/213 3. const_cast = https://hwan-shell.tistory.com/215 4. reinterpret_cast = https://

hwan-shell.tistory.com

https://zbomoon.tistory.com/22

 

[C++]static_cast와 C 스타일 캐스트의 차이

C/C++ 프로그래밍 - static_cast와 C스타일 캐스트의 차이 C++는 1990년에 이미 가장 중요한 프로그래밍 언어가 되었습니다. 하지만 아직 C++의 OOP 부분(Class)만 사용할 뿐 구체적인 신기능들을 무시한체

zbomoon.tistory.com