프로그래밍(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
https://gamelaboratory.tistory.com/entry/C-%ED%98%95%EB%B3%80%ED%99%98-staticcast