by 꽈배기
int -> char 의 경우도 마찬가지로 상위 3바이트를 버리게 된다.
포인터의 명시적 표시의 이유? 예를들어 int*의 경우 int가 4byte 이기에 최하위 비트 기준 4byte 만큼의 데이터를 가리킬 수 있음을 뜻한다.
동적 캐스팅 방법, reinterpret_cast는 관련 없는 클래스 간 형 변환에도 사용할 수 있지만, 런타임에 검사나 변환을 수행하지 않음. 가장 큰 차이점은 reinterpret_cast는 가리키는 실제 객체가 대상 클래스와 실제로 일치하는지 확인하지 않고 항상 성공하여 한 객체 유형의 메모리 주소를 다른 객체 유형으로 변환한다는 것인데, 이는 원시 타입 포인터등에 사용될 수 있다.
임시 수정: 짧은 기간 동안 상수 객체를 수정해야 하지만 전체 객체를 상수가 아닌 것으로 만들고 싶지 않을 때가 있습니다. const_cast를 사용하면 이 작업을 수행할 수 있습니다.
#include <iostream>
class Animal {
public:
virtual void sound() = 0;
};
class Dog : public Animal {
public:
void sound() { std::cout << "Woof!" << std::endl; }
};
int main() {
// Static Cast Example
Animal* animalPtr = new Dog();
Dog* dogPtr = static_cast<Dog*>(animalPtr);
dogPtr->sound(); // Output: Woof!
// Dynamic Cast Example
// This will throw an exception at runtime!
Animal* animal2Ptr = new Cat();
if (Dog* dog2Ptr = dynamic_cast<Dog*>(animal2Ptr)) {
dog2Ptr->sound();
} else {
std::cout << "Not a Dog!" << std::endl;
}
// Reinterpret Cast Example
Animal* animalPtr = new Dog();
Dog* dogPtr = reinterpret_cast<Dog*>(animalPtr);
dogPtr->sound(); // Output: Woof!
// Reinterpret Cast Example 2 (Non exsist)
Animal* animalPtr = new Dog();
//can use undefined type
//will not throw an exception at runtime but cause error maybe
Tiger* tigerPtr = reinterpret_cast<Tiger*>(animalPtr);
tigerPtr->sound(); // error
//const cast
//스택영역에 저장된 const로 readonly 제한 영역이 아님. 수정 o
const int a = 3;
const int* pa = &a;
int* paa = const_cast<int*>(pa);
*paa = 6;
// readonly 영역이므로 쓰기 제한이 걸려버림.
const char* c = "gfg";
char* d = const_cast<char*>(c);
*d = 'c';
return 0;
}
class Parent {
};
class A :public Parent
{
public:
void A_func() { };
};
class B:public Parent {
public:
void B_func() { };
};
Parent* pa = new Parent();
A* a = static_cast<A*>(pa);
// A != B 원래 이게 되면 안되는데, 상속을 개발자가 잘못하면 이렇게 된다.
Parent* a_p = static_cast<Parent*>(a);
a_p = static_cast<B*>(a_p);