Warum muss man += extra überladen?



  • class foo{
    public:
    	int i;
    };
    
    foo& operator+(foo& f1, const foo& f2){
    	f1.i+=f2.i;
    	return f1;
    }
    
    int main(int argc, char** argv) {
    
    	foo f1,f2;
    	f1.i=8;
    	f2.i=1;
    	f1=f1+f2;
    	f1+=f2;
    
    	std::cout<<f1.i;
    
    	return 0;
    }
    

    Wenn man + überläd müsste += doch automatisch überladen sein. x+=y ist doch nur die Kurzschreibweise für x=x+y. Warum muss man += trotzdem nochmal überladen?



  • überlader schrieb:

    Wenn man + überläd müsste += doch automatisch überladen sein. x+=y ist doch nur die Kurzschreibweise für x=x+y. Warum muss man += trotzdem nochmal überladen?

    Nein, das ist ein Trugschluß (es wird zwar in anderen Sprachen teilweise so gemacht aber nicht in C++), und hat auch mit effizienz zu tun. Zudem solltest du wenn anders rum denken: + läßt sich auch durch += umsetzen...

    Zudem ist dein + falsch überschrieben. + sollte das Objekt nicht ändern, += schon. Zudem sollte + ein Objekt zurückgeben, += eine Referenz.
    Regel: Orientiere dich an int (Es ist intuitiver wenn sich deine Operatoren so verhalten wie man es von int gewohnt ist).

    Und:

    int a = 1;
    int b = 2;
    int c = a + b;
    

    Ändert weder a noch b.

    class Foo
    {
      private:
        int a;
      public:
        Foo(int a=0)
        : a(a)
        {}
    
        Foo& operator+=(Foo const & rhs)
        {
          this->a += rhs.a;
          return *this;
        }
    };
    
    Foo operator+(const Foo& lhs, const Foo& rhs)
    {
        Foo returnValue(lhs); // Kopie anlegen
        returnValue += rhs;   // operator += auf Kopie anwenden
        return returnValue;   // Kopie zurückliefern
    }
    

    + arbeitet mit Temporären Objekten, += nicht.

    cu André



  • danke


Anmelden zum Antworten