반응형
1. dynamic_cast<자료형>(변환 대상)
상속관계에 놓여 있는 두 클래스 사이에서 자식 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우
class Car
{
// ...
}
class Truck : public Car
{
// ...
}
int main(void)
{
Car *pcar1 = new Truck();
Truck ptruck1 = dynamic_cast<Truck *>(pcar1); // 컴파일 에러
Car *pcar2 = new Car();
Truck *ptruck2 = dynamic_cast(Truck *>(pcar2); // 컴파일 에러
Truck *ptruck3 = new Truck();
Car *pcar3 = dynamic_cast<Car *>(ptruck3); // 컴파일 OK
return 0;
}
2. static_cast<자료형>(변환 대상)
상속관계에 놓여있다면 부모, 자식 관계를 따지지 않고 형변환 시켜준다. 다만, 그에 따른 책임은 프로그래머에게 있다.
dynamic_cast의 예제 코드의 컴파일 에러 부분이 전부 정상적으로 형변환이 되어 컴파일이 된다.
하지만,
Car *pcar2 = new Car();
Truck *ptruck2 = dynamic_cast(Truck *>(pcar2);
위와 같은 경우 자식 클래스에만 정의된 함수를 호출하거나 하는 경우 결과를 예측할 수 없다.
추가로 C언어에서 사용하던 (int)doubleVariable 같은 형식으 형변환은 static_cast<int>(doubleVariable)로 사용하면 된다.
(모든 경우가 다 되는 것은 아니다. const_cast, reinterpret_cast로만 변환 가능한 경우도 있다.)
3. const_cast<자료형>(변환 대상)
포인터와 참조자의 const 성향을 제거하는 형변환.
void showString(char *str)
{
cout << str << endl;
}
void showAddResult(int &n1, int &n2)
{
cout << n1 + n2 << endl;
}
int main(void)
{
const char *name = "Test Name";
showString(const_cast<char *>(name));
const int &num1 = 100;
const int &num2 = 200;
showAddResult(const_cast<int &>(num1), const_cast<int &>(num2));
return 0;
}
위와 같이 사용 가능하다. 하지만, const 선언이 '값의 변경을 허용하지 않는다'라는 의미로 사용하기 때문에 그 의미가 무색해지기 때문에
되도록이면 사용하지 않도록 한다.
4. reinterpret_cast<자료형>(변환 대상)
상관없는 자료형의 두 데이터간 형 변환
(포인터를 대상으로 하는, 그리고 포인터와 관련이 있는 모든 유형의 형 변환을 허용)
class AAA {...};
class BBB {...};
int main(void)
{
AAA *a = new AAA();
BBB *b = reinterpret_cast<BBB *>(a);
// ...
}
위와 같이 전혀 연관 없는 자료형 간에도 형변환이 된다.
그럼, 어떠한 경우에 사용이 되는걸까...
#include <iostream>
using namespace std;
int main(void)
{
int num = 0x010203;
char *ptr = reinterpret_cast<char *>(&num);
for(int i = 0; i < sizeof(num); i++){
cout << static_cast<int>(*(ptr + 1)) << endl;
}
return 0;
}
이처럼 정수형 변수를 char*형으로 형변환 하여 정수형 변수에 1byte 단위로 접근하고자 할 때 사용 할 수 있다.
반응형
'C++ > Study' 카테고리의 다른 글
[C++] 대입 연산자 오버로딩 시 유의점 (0) | 2024.12.13 |
---|---|
[C++] 클래스 템플릿 기반의 객체 생성 (0) | 2024.12.13 |
[C++] 증감연산자(전위형 후위형) (0) | 2024.12.13 |
[C++] 함수 오버로딩 (0) | 2024.12.13 |
[C++] namespace (0) | 2024.12.13 |