2017-11-25 3 views
-1

Ich spielte mit dem Überladen verschiedener Operatoren und fügte print-Anweisungen hinzu, um zu sehen, was passierte. Als ich den Post-Inkrement-Operator überlastete, sah ich, dass der Konstruktor zweimal aufgerufen wurde, aber ich verstehe nicht warum.Warum wird beim Überladen des Post-Inkrement-Operators in C++ der Konstruktor zweimal aufgerufen?

#include <iostream> 
using namespace std; 

class ParentClass { 
    public: 
    ParentClass() { 
     cout << "In ParentClass!" << endl; 
    } 
}; 

class ChildClass : public ParentClass { 
    public: 
     int value; 
     ChildClass() { } 
     ChildClass(int a) 
     : value(a) { 
      cout << "In ChildClass!" << endl; 
     } 

     int getValue() { return value; } 

     ChildClass operator++(int) { 
      cout << "DEBUG 30\n"; 
      this->value++; 
      return this->value; 
     } 
}; 

int main() { 
    cout << "DEBUG 10\n"; 
    ChildClass child(0); 
    cout << "value initial  = " << child.getValue() << endl; 
    cout << "DEBUG 20\n"; 
    child++; 
    cout << "DEBUG 40\n"; 
    cout << "value incremented = " << child.getValue() << endl; 
} 

Der Ausgang nach dem Ausführen dieses Codes ist:

DEBUG 10 
In ParentClass! 
In ChildClass! 
value initial  = 0 
DEBUG 20 
DEBUG 30 
In ParentClass! 
In ChildClass! 
DEBUG 40 
value incremented = 1 
+0

Beachten Sie, dass der Code den ** post ** - Inkrement-Operator überlädt, aber ein ** pre ** - Inkrement implementiert. –

+0

@PeteBecker Vielleicht vermisse ich etwas. Ich dachte, dass das Hinzufügen des Parameters 'int' im Operator ++ (int) die Post-Inkrementierung implementiert? – yamex5

+1

Der Code gibt den inkrementierten Wert zurück. Das ist, was Pre-Inkrement tut. Post-Inkrement sollte den ursprünglichen Wert zurückgeben. –

Antwort

1

Diese Aussage

return this->value; 

int

Aber die Methode Prototyp ist

Rückkehr Says

Also der Compiler denkt, bekam ein int brauchen ein ChildClass - Lets Konstruieren eines aus der int. Daher die Ausgabe

+0

Ich folgte einem Beispiel für binäre Operatoren, wo ein neuer Typ mit dem Ergebnis zurückgegeben wird. Ich habe die return-Anweisung entfernt, und tatsächlich wird der Konstruktor tatsächlich einmal aufgerufen. Und auch das Ändern des Rückgabetyps in int funktioniert. Vielen Dank! – yamex5

+1

@ yamex5,'ClassClass's '++' return 'int' zu haben ist eine wirklich böse Überraschung für alle, die das übliche Verhalten von' operator ++' erwarten. Siehe [Was sind die Grundregeln und Idiome für das Überladen von Operatoren?] (Https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-andidioms-for-operator-overloading) für ein umfangreiches Beispiel Überschreibung beim Überladen von Operatoren. – user4581301

+0

@ user4581301 - Es wird kein 'int' zurückgegeben. Sehen Sie den Prototyp und meine Erklärung –

Verwandte Themen