13.11 Overloading typecasts

주홍영·2022년 3월 18일
0

Learncpp.com

목록 보기
154/199

https://www.learncpp.com/cpp-tutorial/overloading-typecasts/

일반적인 built-in data type에 대해서 어떻게 type 변환을 진행하는지 c++이 자체적으로 알고 있기 때문에 문제가 없다. 하지만 user-defined type의 경우에는 어떻게 해야할까?
그래서 typecast에 overloading이 존재하는 것이다

User-defined conversions allow us to convert our class into another data type. Take a look at the following class:

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

    int getCents() const { return m_cents; }
    void setCents(int cents) { m_cents = cents; }
};

위의 클래스는 꽤나 간단하다
그런데 만약 위의 클래스를 int type으로 바꾸고 싶다면 어떻게 해야할까?

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

    // Overloaded int cast
    operator int() const { return m_cents; }

    int getCents() const { return m_cents; }
    void setCents(int cents) { m_cents = cents; }
};

위에서 operator int()가 보일 것이다 (그냥 parenthesis operator가 아니다)
위의 overloading에는 3가지 주목할 점이 있다
1. 클래스를 int로 변환하는 함수를 오버로드하기 위해 클래스에 operator int()라는 새 함수를 작성합니다. operator라는 단어와 우리가 캐스팅할 유형 사이에 공백이 있다는 점에 유의하세요.
2. user defined conversion은 argument를 전달할 방법이 없기 때문에 parameter를 사용하지 않습니다.
3. User-defined conversions do not have a return type. C++ assumes you will be returning the correct type.
return type이 읎다!! 원래대로면 operator 텍스트 이전에 return type이 있을 것이다(마치 함수처럼) c++이 프로그래머가 잘 알아서 할거라고 가정하고 있다

여기 Dollars class를 Cents class로 typecast하는 것을 overloading하는 예시가 있다

class Dollars
{
private:
    int m_dollars;
public:
    Dollars(int dollars=0)
        : m_dollars{ dollars }
    {
    }

     // Allow us to convert Dollars into Cents
     operator Cents() const { return Cents{ m_dollars * 100 }; }
};

위의 코드는 Dollars를 Cents로 direct conversion할 수 있도록 만들어준다

#include <iostream>

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

    // Overloaded int cast
    operator int() const { return m_cents; }

    int getCents() const { return m_cents; }
    void setCents(int cents) { m_cents = cents; }
};

class Dollars
{
private:
    int m_dollars;
public:
    Dollars(int dollars=0)
        : m_dollars{ dollars }
    {
    }

    // Allow us to convert Dollars into Cents
    operator Cents() const { return Cents { m_dollars * 100 }; }
};

void printCents(Cents cents)
{
    std::cout << cents; // cents will be implicitly cast to an int here
}

int main()
{
    Dollars dollars{ 9 };
    printCents(dollars); // dollars will be implicitly cast to a Cents here

    std::cout << '\n';

    return 0;
}

dollars가 Cents 타입으로 implicitly 변환되고
std::cout <<에서 Cents 타입이 int로 변환되어 최종적으로

900

의 출력이 나오게 된다

profile
청룡동거주민

0개의 댓글