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
Beachten Sie, dass der Code den ** post ** - Inkrement-Operator überlädt, aber ein ** pre ** - Inkrement implementiert. –
@PeteBecker Vielleicht vermisse ich etwas. Ich dachte, dass das Hinzufügen des Parameters 'int' im Operator ++ (int) die Post-Inkrementierung implementiert? – yamex5
Der Code gibt den inkrementierten Wert zurück. Das ist, was Pre-Inkrement tut. Post-Inkrement sollte den ursprünglichen Wert zurückgeben. –