정체불명의 모모

[c++]static_cast 란? 본문

프로그래밍(c++)

[c++]static_cast 란?

정체불명의 모모 2021. 9. 8. 18:29
static_cast란?

: 기본 자료형의 형변환 및 기본(base) 클래스에서 파생(derived) 클래스로의 포인터 변환 연산에 사용할 수 있다.

   형 변환 시점이 컴파일 시점이기 때문에 static 이라는 명칭이 붙는다.

   ( 정적 캐스팅 / 논리적인 캐스팅 / 묵시적 형변환과 같다.)

static_cast<바꾸려는 타입>(대상)

static_cast를 사용하는 이유
  • 실수형과 정수형, 정수형과 열거형등의 기본 데이터 타입 간의 변환
  • 상속관계의 클래스 계층 간의 변환
  • void  포인터를 다른 타입의 포인터로 변환
  • 서로 다른 타입의 포인터 간의 타입 변환은 못함
static_cast의 제약 사항
  • 런타임 타입 검사를 하지 않음
  • 아형성이 없어도 변환가능(RTTI 옵션이 꺼져있어도 된다.)
  • 다중 상속에서 기본 클래 간의 타입 변환은 못함

일반 변수의 형변환들 예제
#include <iostream>

using namespace std;

int main()
{
    double dou = 10.1234;
    int integer_1 = dou;    // 묵시적 형변환
    int integer_2 = (int)dou; // 명시적 형변환
    int integer_3 = static_cast<int>(dou);  // static_cast 형변환
    
    char a = 'a';
    
    int charInt = static_cast<char>(a);
    
    cout << integer_1 << endl;	// 10
    cout << integer_2 << endl;	// 10
    cout << integer_3 << endl;	// 10
    cout << charInt << endl;	// 97

    return 0;
}

포인터에서의 형변환들
#include <iostream>

using namespace std;

int main()
{
    double* dou = new double(10.1234);
//    int * integer_1 = dou;  // 묵시적 형변환
    int * integer_2 = (int*)dou;    // 명시적 형변환
//    int * integer_3 = static_cast<int*>(dou);   // static_cast 형변환
    
    
    cout << *integer_2 << endl; // 1223206686 <- 이상한 값 출력
    return 0;
}

※ 명시적 형변환이 허용이 되었다고 해도 실제로 값은 이상하게 출력된다.


상속관계에서의 형변환
#include <iostream>

using namespace std;

class Animal
{
public:
    virtual void sound() = 0;
    void info()
    {
        cout << "동물은 숨을 쉽니다." << endl;
    }
};

class Dog : public Animal
{
private:
    string name;
    
public:
    Dog(string s) : name(s) {};
    void sound() {cout << "멍멍!" << endl;}
    void name_print() {cout << name << endl;}
    void only_dog() {cout << "이건 개 클래스" << endl;}
};

class Cat : public Animal
{
private:
    string name;
    
public:
    Cat(string s) : name(s) {};
    void sound() {cout << "야옹!" << endl;}
    void name_print() {cout << name << endl;}
    void only_cat() {cout << "이건 고양이 클래스" << endl;}
};

int main()
{
    Cat* cat_1 = new Cat("나비");
    Dog* dog_1 = new Dog("멍멍이");
    
   // cat_1 = dog_1;  // 묵시적 형변환
    cat_1= (Cat*)dog_1; // 명시적 형변환
   // cat_1 = static_cast<Cat*>(dog_1);   //static_cast 형변환
    
    cat_1->sound();	// 멍멍!
    cat_1->only_cat();	// 이건 고양이 클래스
    
    return 0;
}

※ 이상한 결과 값이 나오는것을 확인 할 수 있다.


참고 사이트

https://hwan-shell.tistory.com/211?category=703822 

 

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..

hwan-shell.tistory.com

https://gamelaboratory.tistory.com/entry/C-%ED%98%95%EB%B3%80%ED%99%98-staticcast

 

C++ - 형변환 static_cast

2. static_cast 기본 자료형의 형변환 및 기본(base) 클래스에서 파생(derived) 클래스로의 포인터 변환 연산에 사용할수 있다. 묵시적 형변환과 같다. 1) 특징 (1) 명시적으로 정수 값을 열거 형식으로 변

gamelaboratory.tistory.com

https://prostars.net/64

 

C++ 이야기 - [3] 캐스트 연산자 static_cast

C++의 4가지 캐스트 연산자에 대한 이야기 중 세 번째다. 이번은 그중에서 static_cast 에 대해서 이야기한다. static_cast 는 기본적으로 C 스타일의 캐스팅과 가장 비슷한 기능을 한다. 물론 C 스타일의

prostars.net

 

Comments