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 |