c++의 명시적 캐스트 연사자들이다.
1. const_cast
클래스에서 const, volatile 및 __unaligned 특성을 제거합니다.
void main()
{
char str[] = "String";
const char *c1=str;
char *c2;
c2 = const_cast<char *>(c1);
c2[0] = 'a';
printf("%s\n", c2);
}
결과 : atring
2. static_cast
명시적 형 변환을 위한 캐스트 연산자.
class super
{
};
class sub : public super
{
};
int main()
{
sub* ss = static_cast<sub*>(new super());
}
// sub* ss = new super();
// '초기화 중' : super *'에서 'main::sub *'(으) 로 변환할수 없습니다.
// 기본 형식에서 파생 형식으로 캐스팅하려면 dynamic_cast 또는 static_cast가 필요합니다.
3. dynamic_cast
포인터나 레퍼런스를 기본 클래스 -> 파생 클래스로의 다운 캐스팅과,
다중 상속에서 클래스 간의 안전한 타입 캐스팅에 사용된다.
안전하지만 느리다.
이 연산자를 사용하려면 '하나 이상의 virtual 함수' 가 존재해야한다.
class super
{
};
class sub : public super
{
};
int main()
{
sub* ss = dynamic_cast<sub*>(new super());
}
위 코드는 실행이 불가능하다
해당 클래스가 '다형 형식'이 아니라고 경고문이 나온다.
그럼 다형 형식이란?
위에서. 이 dynamic_cast연산자를 사용하려면
하나 이상의 virtual함수 가 존재해야한다.
virtual함수. 즉 가상 함수는 오버라이딩을통해 '다형성'을 구축한다.
class super
{
public:
virtual void func()
{
prtinf_s("부모의 가상 함수.\n");
}
};
class sub : public super
{
};
int main()
{
sub* ss = dynamic_cast<sub*>(new super());
if(ss == NULL)
{
prtinf_s("변환 실패\n");
}
ss->func();
}
4. reinterpret_cast
타입이니 뭐니 하는 것을 따지지 않고 무조건적으로 변환해버린다.
(reinterpret 다시 해석하다, 새로해석하다)
대단히 위험한 방법으로, 안전하다는 보장이 없다.
void main()
{
int a = 123;
double *b = nullptr;
b = reinterpret_cast<double*>(a);
printf_s("%d\n", a);
printf_s("%d\n", b);
}
'게임 프로그래밍 > C++ 기초' 카테고리의 다른 글
오버라이딩 (Overriding) (0) | 2020.03.02 |
---|---|
C++ Map [STL] (0) | 2019.02.23 |
C++ 증감연산자 (전,후) 구현 (0) | 2019.01.25 |
C++ memcpy_s 함수 구현 (0) | 2019.01.25 |
C++ memset 함수 구현 (0) | 2019.01.25 |