C++ 클래스에는 변환 연산자라는 특수한 형태의 함수(메소드)를 정의할 수 있습니다.
이전에 포스팅한 변환 생성자와 반대되는 개념입니다.
변환 생성자에 대한 설명은 아래 링크에서 확인 가능합니다.
2014/12/08 - [Programming/C&C++] - C++ 변환 생성자(Conversion Constructor)
변환 생성자는 일반 타입에서 클래스의 객체를 생성하는 역할을 하지만
변환 연산자는 반대로 객체에서 일반 타입 값을 받을 수 있습니다.
변환 연산자는 operator 타입명(); 과 같은 형태로 선언이 가능합니다.
#include <iostream>
using namespace std;
class Distance
{
private:
int kilometer, meter;
public:
Distance() : kilometer(0), meter(0){}
explicit Distance(int newDist)
{
kilometer = newDist / 1000;
meter = newDist % 1000;
}
operator int()
{
return kilometer * 1000 + meter;
}
void PrintDistance()
{
cout << "Distance is " << kilometer << "km " << meter << "m\n";
}
};
int main()
{
Distance d(2030);
int nDist = d;
cout << "Value is " << nDist << endl;
return 0;
}
operator int()로 된 부분이 변환 연산자입니다.
변환 생성자와 마찬가지로 변환 연산자도 여러 기본 타입으로 작성할 수 있습니다.
그리고 변환 생성자와 마찬가지로 문제가 될 소지가 존재합니다.
문제가 되는 상황은 다음과 같습니다.
void DistanceFunc(int nDist)
{
cout << "Value is " << nDist << endl;
}
int main()
{
Distance d(2030);
DistanceFunc(d);
return 0;
}
DistanceFunc 함수를 추가했고 int 타입을 전달 받습니다.
main에서 보시면 Distance의 객체를 통해서 DistanceFunc를 호출합니다.
이런 상황을 의도해서 작성한 게 아니라면 문제가 발생할 수 있습니다.
C++11 이전에는 explicit 키워드를 변환 연산자에 사용하는 것이 불가능했습니다.
하지만 C++11이 적용된 컴파일러에서는 변환 연산자 앞에도 explicit 키워드를 사용할 수 있습니다.
되도록이면 explicit 키워드를 사용해서 명시적 변환만 가능하도록 작성하는 것을 추천합니다.
혹은 C# 등의 언어와 같이 ToString() 등의 메소드를 추가해서 사용하는 것을 권장합니다.
'Programming > C&CPP' 카테고리의 다른 글
| new 사용시 예외 처리 (0) | 2014.12.15 |
|---|---|
| 스마트하지 못한 스마트한 포인터 auto_ptr (0) | 2014.12.08 |
| C++ 변환 생성자(Conversion Constructor) (0) | 2014.12.08 |
| 가변 인자 함수의 사용법(vprintf, vsprintf) (0) | 2014.12.07 |
| 가변 인자(Variable Arguments) 내부 구조 (0) | 2014.12.07 |