C++/Overloading 2021. 3. 16. 00:19

산술 연산자 오버로딩 (Arithmetic Operator Overloading)

  • 클래스 안에서 정의해도 되고, 밖에서 정의해도 된다.

    • 안에서 정의할 때는 this로 첫 번째 파라미터를 받게되므로 파라미터가 하나 줄어든다.

    • 밖에서 정의할 때는 클래스에서 friend 키워드로 선언해주는게 편할 수도 있다.


예제

  • 오버로딩을 하지 않은 예제

    #include <iostream>
    
    class Cents
    {
      int    cents_;
    
    public:
      Cents(const int& cents = 0) { cents_ = cents; }
      int        getCents() const { return cents_; }
      int&    getCents() { return cents_; }
    };
    
    Cents    add(const Cents& c1, const Cents& c2)
    {
      return Cents(c1.getCents() + c2.getCents());
    }
    
    int        main()
    {
      using namespace std;
    
      Cents cents1(6);
      Cents cents2(8);
    
      cout << add(cents1, cents2).getCents() << endl;
    }
    
    /* stdout
    14
    */
  • + 연산자 오버로딩을 하면 다음과 같다.

    #include <iostream>
    
    class Cents
    {
      int    cents_;
    
    public:
      Cents(const int& cents = 0) { cents_ = cents; }
      int        getCents() const { return cents_; }
      int&    getCents() { return cents_; }
    };
    
    Cents    operator + (const Cents& c1, const Cents& c2)
    {
      return Cents(c1.getCents() + c2.getCents());
    }
    
    int        main()
    {
      using namespace std;
    
      Cents cents1(6);
      Cents cents2(8);
    
      cout << (cents1 + cents2 + Cents(6)).getCents() << endl;
    }
    
    /* stdout
    20
    */
  • 클래스 안에서 정의하면 다음과 같다.

    #include <iostream>
    
    class Cents
    {
      int    cents_;
    
    public:
      Cents(const int& cents = 0) { cents_ = cents; }
      int        getCents() const { return cents_; }
      int&    getCents() { return cents_; }
    
      Cents    operator + (const Cents& c2)
      {
        return Cents(cents_ + c2.cents_);
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Cents cents1(6);
      Cents cents2(8);
    
      cout << (cents1 + cents2 + Cents(16)).getCents() << endl;
    }
    
    /* stdout
    30
    */