C++ 에는 C 형식의 형변환을 물려 받았으면서도 4가지 형 변현이 더 있다. 대부분 C 형식의 형변환만 사용할 것이다. 그러나 정확한 사용을 위해선는 C++ 의 형변환 만을 사용하는게 옮을 것이다. (그러나 이게 좀 귀찮다. )

오래된 C++ 컴파일러라면 이 형변환을 지원하지 않을 수도 있다. (그렇게 오래된 것을 사용하기 보다는 자기에 컴퓨터와 운영체제에 맞는 gcc 컴파일러를 사용하는게 더 좋을 것 같다. )

C++ 에서 도입된 4가지 형변환은 const_cast , static_cast , dyamic_cast , reinterpret_cast 가 있다. 그리고 사용법은 기존가 조금 다른
static_cast (expression ) 처럼 사용한다.

const_cast 는 const 나 volatile 속성을 제거하거나 추가 할 때 다른 자료형으로 변환을 할 때 이용된다.

void Modify ( const int *pci)
{
    int *pi = const_cast (pci);
    *pci = 200
}

main 에서
{
    ...
    int i = 100;
    Modify(&i);

    const int ci = 100;
    Modify(&ci);
}

이 때 i 는 200 으로 변경된다. ci 는 표준이 없어 컴파일러 마다 다른 동작을 보인다. 비주얼 스트디오에서는 임시변수를 사용해 ci 를 보호한다. 따라서 ci = 100 으로 변경되지 않는다.


대부분 형변환 할 때는 되에는 static _cast 를 사용한다.
상속관계를 각는
   A
 /   \
B      C
의 경우
A * pa = new A;
C * pc = static_cast(pa);
처럼 하여 사용할 수 있다.

dynamic_cast 는 다운 캐스팅 할 때 사용된다.
  A
 /   \
B      C

A * pa = &c; // upcasting 이므로 언제나 안전하다. 포인터형
A & ra = c; // upcasting 이므로 언제나 안전하다. 레퍼런스형

C c;

B * pb = &C ;
B & rb = c;

C * pc3 = dynamic_cast(pb);
C & rc3 = dynamic_cast(rb);

//upcasting 했던 것이므로 암시적으로 불가능
// RTTI 가 형변환 할 때 실행 시간에 검사 => 오버헤드 발생

reinterprt_cast
값에 대한 변경을 하지 않는다. 보통 int 타입을 float 으로 변환 할 때 IEEE 745 에 맞게 메모리에 보관하는 방식이 변경되어야 한다. 윈도우 환경에서 LPARAM 이나 DWORD 같은 타입에 포인터를 보관하는 경우에 유용하다.
!!주의 : platform 마다 결과가 다를 수 있다. big endian 과 little endian 사이에 특히.
class 끼리의 형변환 주의 (virtual 함수가 있는 class 에서 class 와의 차이
v-ptr 때문에. )

대도록 안 사용하는게 좋다.


오래전에 적어 둔 것이다. 마소 잡지를 보고 적은 것같다. 조금 씩 말이 안되는 문장이 있다. 그리고 웬지 몇가지 틀린 개념이 있는 것 같다. 내 스스로 정리해 둔 것이다 보니 뭔가 좀 이상하다. 좀 연구해 보고 다시 고쳐야 할 것 같다.