하나의 인자에 대해서 명시적 타입 변환의 의미를 명확히 하기 위해서 다음과 같은 4가지 연산자를 제공한다.
1.static_cast
- 타입 변환이 정의되어있는 객체에 대해서만 성공한다. (본래 갖추어진 변환법칙이나 정의된 변환연산)
ex) float x;
cout << static_cast<int> (x); //x는 int로 출력
2.dynamic_cast
- 다형성을 띄고 있는 타입을 실제 타입으로 변환하는 것을 가능하게 한다. 실행시간에 검사됨
다형성 값의 타입을 검사하기 위해서 사용할수도 있다.
ex) class car;
class carb : public car{
...
};
class lirb: public car{
...
};
void f(Car *cp)
{
carb * p = dynamic_cast<carb*> (cp);
if(p == NULL){
//p는 carb타입의 객체가 아니다.
...
}
}
3.const_cast
- 어떤 타입에 상수성을 추가하거나 제거하는데 사용된다.
4.reinterpret_cast
- 컴파일러를 구현한 공급업체가 어떻게 구현했느냐에 따라 다르다. 이식성에 좋지 않다.
지금까지 소개된 연산들은 오직 하나의 인자만을 사용할 수 있다는 것을 기억하자
static_cast <Fraction>(15,100) //예기치 않는 동작!!
1.static_cast
- 타입 변환이 정의되어있는 객체에 대해서만 성공한다. (본래 갖추어진 변환법칙이나 정의된 변환연산)
ex) float x;
cout << static_cast<int> (x); //x는 int로 출력
2.dynamic_cast
- 다형성을 띄고 있는 타입을 실제 타입으로 변환하는 것을 가능하게 한다. 실행시간에 검사됨
다형성 값의 타입을 검사하기 위해서 사용할수도 있다.
ex) class car;
class carb : public car{
...
};
class lirb: public car{
...
};
void f(Car *cp)
{
carb * p = dynamic_cast<carb*> (cp);
if(p == NULL){
//p는 carb타입의 객체가 아니다.
...
}
}
3.const_cast
- 어떤 타입에 상수성을 추가하거나 제거하는데 사용된다.
4.reinterpret_cast
- 컴파일러를 구현한 공급업체가 어떻게 구현했느냐에 따라 다르다. 이식성에 좋지 않다.
지금까지 소개된 연산들은 오직 하나의 인자만을 사용할 수 있다는 것을 기억하자
static_cast <Fraction>(15,100) //예기치 않는 동작!!