C++ Chapter 9.9 : 형변환을 오버로딩 하기

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 9. 연산자 오버로딩 : 형변환을 오버로딩 하기

🔔 형변환 오버로딩이 필요할 때

Cents c;

int(c); // 💥에러!💥 형변환이 이루어져야 한다.

Cents 타입의 객체인 c 를 int로 형변환해야 하지만 암시적으로 자동 형변환이 일어나지 않는다. 직접 Cents 타입의 객체가 어떤 특정 자료형 타입으로 형변환해야할 시점에 호출되는 형변환 연산자 오버로딩이 필요하다.

오버로딩 해놓으면 특정 객체가 어떤 자료형으로 형변환 되야하는 시점에 호출된다.


🔔 형변환 오버로딩 형식

operator 자료형이름()

operator int()
{
	cout << "cast here" << endl;
	cout << m_cents << endl;
	return m_cents;
}

📢 주의사항 : 형변환 연산자 오버로딩은 멤버 함수로만 구현이 가능하다.이유는 모르겠지만😱 전역 함수로 구현하는 것은 막혀있다.


🔔 형변환 오버로딩이 호출되는 시점 보기

#include <iostream>
using namespace std;

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents = 0)
	{
		m_cents = cents;
	}
	int getCents() { return m_cents; }
	void setCents(int cents) { m_cents = cents; }

	operator int()   // ⭐ Cents 타입의 객체가 int 로 형변환 되야 할 때 호출
	{
		cout << "cast here" << endl; 
		cout << m_cents << endl;
		return m_cents;
	}
};

class Dollar
{
private:
	int m_dollars = 0;

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

	operator Cents()  // ⭐ Dollar 타입의 객체가 Cents 타입으로 형변환 되야 할 때 호출
	{
		return Cents(m_dollars*100);
	}
};


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

int main()
{
	Cents cents(7);

	int value = (int)cents;   // 👈형변환 오버로딩 호출 
	value = int(cents);   // 👈형변환 오버로딩 호출 
	value = static_cast<int>(cents);   // 👈형변환 오버로딩 호출 
	printInt(cents);  // 👈형변환 오버로딩 호출 

    Dollar dol(2);

    Cents cents = dol;  // 👈형변환 오버로딩 호출. m_dollars는 200이 된다.

	return 0;
}
  • Centsoperator int()
    • Cents 타입의 객체가 int 로 형변환 되야 할 때 호출
      • 호출될 때
        • int value = (int)cents;
        • value = int(cents);
        • value = static_cast(cents);
        • printInt(cents);
          • 인수를 const int & 타입으로 받는 함수라서
  • Dollaroperator Cents()
    • Dollar 타입의 객체가 Cents 타입으로 형변환 되야 할 때 호출
      • 호출될 때
        • Cents cents = dol;
          • m_dollars 값은 200이 된다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Cpp 카테고리 내 다른 글 보러가기

댓글 남기기