본문 바로가기

Information Technology/C++

[C++] 형변환 오버로딩

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)


class Cents
{
private:
	int m_cents;

public:
	Cents(int cents = 0)
	{
		m_cents = cents;
	}
};

여기 예제로 사용할 Cents 예제가 있습니다.

void printInt(const int& value)
{
	cout << value << endl;
}		

그리고 클래스 바깥에는 int형 변수를 레퍼런스로 받아 출력하는 printInt 함수가 있습니다.

int main()
{
	Cents cents;
	printInt(cents)// error!

	return 0;
}

main함수에서 Cents 자료형 인스턴스인 cents를 초기화하고,

printInt함수에 cents 인스턴스를 매개변수로 줘서 출력하려고 합니다.

언뜻 보기에 Cents 클래스의 멤버인 m_cents가 int형 변수이니 출력이 되는 것 아닌가?

하고 생각할 수 있지만, 이는 Cents 자료형의 인스턴스를 int 자료형으로 '형변환'하는 것이기 때문에 그것과는 상관이 없습니다. 때문에 이 문제를 해결하려면 클래스 내부에 형변환 연산자를 오버로딩 해줘야 합니다.

operator int()
{
	return m_cents;
}

방법은 다음과 같습니다. 형변환하려는 자료형을 operator와 함께 입력하고,

함수의 바디에 형변환을 했을 때 리턴할 값을 정의해주면 됩니다.

이렇게 클래스에 형변환 연산자를 오버로딩해주면 위의 main함수에서 출력하려는 값이 이상 없이 출력됩니다.


이번에는 클래스를 다른 클래스로 형변환 하는 방법을 알아보겠습니다.

class Dollar
{
private:
	int m_dollars = 0;

public:
	Dollar(const int& input) : m_dollars(input) {}

	operator Cents()
	{
		return Cents(m_dollars * 100);
	}
};

Cents 클래스 외에 Dollar 클래스를 하나 더 정의했습니다.

그리고 Dollar 클래스의 멤버로 Cents 클래스로 형변환을 하는 형변환 연산자를 오버로딩했습니다.

위에서 int형 형변환을 오버로딩할 때 처럼 Cents 자료형을 operator옆에 입력하고,

Dollar 자료형을 Cents 자료형으로 형변환을 할 때 리턴할 값을 정의해줍니다.

이 예제에서는 '1달러는 대략 100센트'이므로, Dollar 클래스의 멤버인 m_dollars에 100을 곱한 값으로 초기화 한 Cents클래스의 인스턴스를 리턴합니다.

int main()
{
	Dollar dol(2);
	Cents cents = dol;
	printInt(cents);

	return 0;
}

이를 main함수에서 사용하면, Dollar 자료형 인스턴스 dol를 2로 초기화하고,

Cents 자료형의 인스턴스 cents를 dol로 초기화합니다. 이 과정에서 dol을 Cents 자료형으로 형변환하게 됩니다.

형변환이 잘 되었는지 확인하기 위해 위해서 정의한 printInt함수에 cents를 인자로 주어 호출하면 정상적으로 200이 호출됨을 알 수 있습니다.

'Information Technology > C++' 카테고리의 다른 글

[C++] 함수 템플릿  (0) 2019.11.19
[C++] 변환 생성자와 explicit  (0) 2019.11.19
[C++] 첨자 연산자 오버로딩  (0) 2019.11.17
[C++] 증감 연산자 오버로딩  (0) 2019.11.17
[C++] 비교 연산자 오버로딩  (0) 2019.11.17