편의상 클래스(또는 구조체)를 그냥 클래스로 표현합니다.
1. static_cast
static_cast는 C++ 에서 형변환에서 제일 많이 쓰이고, 일반적인 형변환을 수행합니다.
C스타일 캐스트와의 차이점은 관련없는 타입으로의 형변환이나 규칙을 때어내는 형변환을 시도 할 시 컴파일 타임에 오류를 내어 프로그래머의 실수로 인해 프로그램이 비정상적으로 동작하는 것을 줄여줍니다.
static_cast 는 정수형, 실수형, 논리형, 열거형 사이에서 형변환을 수행 할 수 있습니다.
타입에 const, volatile 특성을 포함시킬 수 있지만
반대로 특성을 제거하는 것은 불가능합니다.
부모클래스를 public 상속받은 자식클래스에서 부모클래스 타입으로 형 변환을 하는 것은 가능하지만, protected 상속 또는 private 상속 받은 자식클래스의 경우 부모클래스로 형변환이 불가능합니다.
부모클래스 타입을 자식 클래스 타입으로 형변환하는것은 불가능합니다.
자식클래스가 부모클래스를 public 상속 받은 경우,
부모 클래스 포인터에서 자식 클래스 포인터로 형변환이 가능합니다.
void 포인터의 경우 관계가 없더라도 다른 포인터 변수로 캐스팅 할 때
에러가 나지 않습니다.
사용 방법
static_cast<변환 할 타입>(변수 혹은 상수)
사용 예
|
2. const_cast
const_cast는 형식 한정자(const 또는 volatile)만 조정 할 수 있는 변환을 수행합니다.
변수의 타입에 const 또는 volatile 을 붙이거나 땔 수 있습니다.
붙이는 것은 static_cast로도 가능하므로, 사실상 const_cast를 사용하게 되는 때는
const 나 volatile 을 땔 때인데, 이유가 있어서 읽기 전용이나 최적화 금지 키워드를 붙인것을 때는 것이니까.. 약간 위험할 수 있겠죠? 잘 아는 분들만 사용하시기 바랍니다.
사용 방법
const_cast<변환 할 타입>(변수 혹은 상수)
사용 예
|
3. reinterpret_cast
reinterpret_cast는 서로 다른 포인터 끼리 또는 포인터와 정수형간 강제적인 형변환을 할 때 사용합니다.
그만큼 위험이 큰 변환이며 프로그래머가 안전하다고 확신하는 경우에 대해서만 사용하도록 권고 되고 있습니다.
static_cast와는 다르게 protected나 private 상속을 받은 부모 자식 클래스 포인터 간에도 형변환이 가능합니다. (전혀 관련없는 클래스에도 형변환이 되니 뭐...)
위험하지만 그래도 const_cast 보다는 은근히 많이 사용되는 편인데요,
네트워크 프로그래밍에서 패킷을 만들 때 패킷을 바이트 스트림을 바꿀 때나,
메모리 풀을 만들 때 등 은근히 사용처가 있습니다.
사용 방법
reinterpret_cast<변환 할 타입>(변수 혹은 상수)
사용 예
|
댓글 없음:
댓글 쓰기