본문 바로가기

Programming/C&CPP

C++ 변환 연산자(Conversion operator)

반응형

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() 등의 메소드를 추가해서 사용하는 것을 권장합니다.

반응형