C++ multiple operator overloads for the same operator

前端 未结 3 1871
星月不相逢
星月不相逢 2021-02-14 04:14

I know I can answer this question easily for myself by generatin the code and see if it compiles. But since I couldn\'t find a similar question, I thought it\'s knowledge worth

相关标签:
3条回答
  • 2021-02-14 04:41

    Yes.


    These operator functions are just ordinary functions with the special names operator@. There's no restriction that they cannot be overloaded. In fact, the << operator used by iostream is an operator with multiple overloads.

    0 讨论(0)
  • 2021-02-14 04:57

    The canonical form of implementing operator+() is a free function based on operator+=(), which your users will expect when you have +. += changes its left-hand argument and should thus be a member. The + treats its arguments symmetrically, and should thus be a free function.

    Something like this should do:

    //Beware, brain-compiled code ahead!
    class MyClass {
    public:
        MyClass& operator+=(const MyClass &rhs) const
        {
          // code for adding MyClass to MyClass
          return *this;
        }
        MyClass& operator+=(int rhs) const
        {
          // code for adding int to MyClass
          return *this;
        }
    };
    
    
    inline MyClass operator+(MyClass lhs, const MyClass& rhs) {
      lhs += rhs;
      return lhs;
    }
    inline MyClass operator+(MyClass lhs, int rhs) {
      lhs += rhs;
      return lhs;
    }
    // maybe you need this one, too
    inline MyClass operator+(int lhs, const MyClass& rhs) {
      return rhs + lhs; // addition should be commutative
    }
    

    (Note that member functions defined with their class' definition are implicitly inline. Also note, that within MyClass, the prefix MyClass:: is either not needed or even wrong.)

    0 讨论(0)
  • 2021-02-14 05:01

    Yes, you can overload operators like this. But I'm not sure what "switch case" you are referring to. You can live with one overload if you have a converting constructor

    class MyClass{
    ...
    // code for creating a MyClass out of an int
    MyClass(int n) { ... }
    ...
    inline const MyClass MyClass::operator+(const MyClass &addend) const {
        cout<<"Adding MyClass+MyClass"<<endl;
        ...//Code for adding MyClass with MyClass
    }
    ...
    };
    

    No switch is needed at all. This is eligible if "MyClass" logically represents a number.

    Notice that you should overload these operators by non-member functions. In your code 5 + c1 would not work, because there is no operator that takes an int as left hand side. The following would work

    inline const MyClass operator+(const MyClass &lhs, const MyClass &rhs) {
      // ...
    }
    

    Now if you keep the converting constructor you can add the int by either side with minimal code overhead.

    0 讨论(0)
提交回复
热议问题