본문 바로가기
!?/C++

형변환

by Where's my namespace 2012. 10. 12.

우리가 일반적으로 흔히 사용하는  (int)a 와 같은 형 변환은 C style이다.

 

C++에도 c++만의 형 변환이 있다. 왜 두가지의 형변환이 필요하지? 라고 궁금할 수도 있는데. c스타일의 형변환은

 

읽기가 어려울 수 도 있다. ( ) 는 함수에서도 쓰이고, 아주 많은 곳에서 쓰이는 것이기 때문에 자칫하면 놓칠수도 있다.

 

그래서 C++ 스타일의 형변환은 읽기에도 편하고, 어떤 용도로 사용 했는지도 알기 쉽다.  C++ 에는 총 4가지의 형변환이

 

있다. 차근차근 알아보자.

 

1. 일반적인 형변환.

일반적으로 많이 쓰는 int - > float 와 같은 형변환이다.

static_cast<type>(대상)

으로 사용한다. 예를 보자.

float a = 10.2;

int b = static_cast<int>(a);

와 같이 사용한다. 일반적으로 C 에서 () 쓰는 것과 같다.

 

2. 위험한 형변환.

일반적으로는 안되는 형변환이다. 포인터를 int 형으로 변환하는 것과 같은 경우다.

reinterpret_cast<type>(대상)

과 같이 쓰고 사용법은 일반적인 형변환과 같다.

 

3. const 를 없애는 형 변환

const_cast<type>(대상) 과 같이 사용하고, 사용법은 같다.

 

4. 상속 관계에 있는 class 간의 형변환

dynamic_cast<type>(대상) 으로 사용한다. 사용법은 같다.

이 형변환의 경우 컴퓨터가 알아서 위험한 것인지 아닌지를 검사까지 해준다. 이 형변환은 부모클래스->자식

으로 형변환 할때 유용하다. 이 형 변환은 C로는 흉내 낼 수 없다.

 

과 같이 4가지의 경우를 살펴봤다. C보다는 확실히 무슨 용도로 쓰이는지 알기 쉽고, 또 안전하다고 할 수 있다.

 

추가로 생성한 클래스를 형변환 하는 방법에 대해 쓰겠다.

class Complex {

public :

int Real;

int Imag;

Complex(int a, int b) : Real(a), Imag(b) {}

}

와 같은 클래스가 있다고 하자. 이 클래스를 int 형으로 형 변환 하고 싶다면,

클래스 내부에

operator int() { return this->Real; } 과 같이 해주면 int 형으로 형 변환 하면 실수부를 반환하라는 의미로 사용 할 수 있다.

저렇게 하면 ,

int i = A  //Complex class 객체

와 같이 사용 할 수 있다.

또 정수를 complex 형으로 바꾸고 싶다면 complex 클래스에 정수하나는 인자로같은 생성자를 만들어 주면 된다.

 

Complex(int a ) : Real(a), Imag(0) {}

과 같이 하면, 허수부는 0 인 complex 객체가 만들어지는데 이를 활용하면 된다.

그럼     A =  i ; 와 같이 사용 할 수 있다. 이는 A = Complex(i) 와 같은 의미가 된다. 

 

이와 관련해서 explicit 이라는 키워드가 있는데 , 이는 암시적인 형 변환을 못하게 하고, 명시적인 형변환만 가능하게 한다.  암시적인 것은 예상 못하게 될 수도 있으니 그걸 미리 방지 할 수 있다.

위 와 같은 경우에는 생성자에

explicit Complex(int a) ~~ 와 같이 해주면 명시적인 형 변환만 가능하게 된다.

 

'!? > C++' 카테고리의 다른 글

QT File browser  (0) 2014.08.29
QT Excel Automation  (0) 2014.08.25
연산자 오버로딩  (0) 2012.10.12
접근 범위, 존속 기간  (0) 2012.09.14
Exception Handling  (0) 2012.09.10