IT_Programming/C · C++

[C++] Casting (형변환)

JJun ™ 2010. 5. 15. 15:28

C언어의 제제가 없는 캐스팅을 한 차원 높여 C++에서는 몇 가지 캐스팅 예약어를 만들었다고 한다.

 

C언어의 구형 스타일 캐스팅보다 훨씬 알아보기 쉽기 때문에 소스 코드 어디에서 C++의 타입 시스템이 망가졌는지를 찾아보는 작업이 편해지고, 캐스트를 사용한 목적을 더 좁혀서 지정하기 때문에

컴파일러 쪽에서 사용 에러를 진단 할 수 있다는 장점이 있다.

 

 

1. static_cast : C언어의 캐스팅과 동일한 역할을 한다.

                           암시적 변환(비상수 객체 → 상수 객체, int → double)을 강제로

                           진행할 때 사용된다. 흔히들 이루어지는 타입 변환을 거꾸로 수행하는

                           용도로도 쓰인다. (void* → 일반 타입의 포인터, 기본 클래스 포인터

                           → 파생 클래스의 포인터). 하지만 상수 객체를 비상수 객체로 캐스팅

                           하는데에는 사용할 수 없다.

 

  char ch = 'A';
  int x = static_cast<int>(ch);
 
 
2. const_cast : const or volatile 효과를 제거
                           객체의 상수성을 없애는 용도로 사용된다.
#include <iostream>
using namespace std;
void show(int *p) {
    cout << *p << endl;
}
int main() {
    int x = 10;
    const int &ref = x;
    show(const_cast<int *>(&ref));
    return 0;
}

 

 

3. dynamic_cast : 상속 계층 구조에서 사용, 가상 함수가 없는 타입에는 적용 불가!!!

                                이른바 '안전한 다운 캐스팅'을 할 때 사용하는 연산자.

                                즉, 주어진 객체가 어떤 클래스 상속 계통에 속한 특정 타입인지

                                아닌지를 결정하는 작업에 쓰인다. 덤으로 런타임 비용이 높은

                                캐스트 연산자로도 유일하다.

 

class CCar {
public:
    virtual void show() {
        cout << "car~" << endl;
    }
private:
};
class CSuperCar : public CCar {
public:
    virtual void show() {
        cout << "the most superior!" << endl;
    }
private:
};
class CComputer {
public:
private:
};
int main() {
    CCar        *a = new CSuperCar();
    CSuperCar    *b = dynamic_cast<CSuperCar *>(a);
    CComputer    *c = dynamic_cast<CComputer *>(a);
    cout << c << endl;
    return 0;
}

캐스팅 불가능하면, NULL값을 대입한다.

 

 

 

4. reinterpret_cast : 포인터와 포인터 간의 변환

                                    포인터를 int로 바꾸는 등의 하부 수준 캐스팅을 위해 만들어진

                                    연산자. 이것의 적용 결과는 구현 환경에 의존적이다.

                                    이런 캐스트는 하부 수준 코드외에는 거의 없어야 한다.

 

#include <iostream>
using namespace std;
int main() {
    unsigned char *buffer = new unsigned char[4];
    buffer[0] = 1;
    buffer[1] = 0;
    buffer[2] = 0;
    buffer[3] = 0;
    int *p = reinterpret_cast<int *>(buffer);
    cout << *p << endl;
    return 0;
}

'IT_Programming > C · C++' 카테고리의 다른 글

Closure in C++  (0) 2011.05.12
[펌] C/C++ volatile에 대한 오해   (0) 2010.10.20
[C++] assert  (0) 2009.11.12
[C] C언어에서 inline assembly 사용하기  (0) 2009.10.07
[펌] MySQL 최적화 c api 소스  (0) 2009.09.16