Return das aktuelle Objekt (*this) in C++?
Ich habe den folgenden code:
Code 1
class Student {
int no;
char grade[M+1];
public:
Student() {
no = 0;
grade[0] = '\0';
}
void set(int n, const char* g) {
no = n;
strcpy(grade, g);
}
const Student getObject() {
return *this;
}
void display() const {
cout << no << ", " << grade << endl;
}
};
Code 2:
//no change from code 1
const Student& getObject() {
return *this;
}
//no change from code 1
Als das Buch, das ich Lesen, erklärt den Unterschied in der getObject() der code 1 und 2 ist, dass die getObject () - code 2 liefert eine Referenz auf das aktuelle Objekt, statt einer Kopie (aus Effizienzgründen).
Jedoch, die ich getestet habe (code 2) wie folgt:
Getesteten code:
Student harry, harry1;
harry.set(123, "ABCD");
harry1 = harry.getObject();
harry1.set(1111,"MMMMMM");
harry.display(); //Line 1 => displayed: 123, ABCD
harry1.display(); / Line 2 => displayed: 1111, MMMMMM
Ich bekomme es nicht. Wenn Sie die getObject() liefert eine Referenz, dann die Linie 1 in den getesteten code sollte auch anzeigen, 111, MMMMMM? Weil ich dachte, dass harry1 sollte die Adresse von harry-Objekt???
Oder bin ich Missverständnis, was?
- Es ist nicht nur für Effizienz. Manchmal ist ein kopieren nicht möglich ist.
- re alle Vorschläge zu ändern
harry1
zuStudent&
- das wird nicht funktionieren, wiegetObj()
gibt eine const ref Student, so würde nicht kompilieren. - Lesen Sie über die Zuweisungs-operator. Sie verwenden es, wie dieser
harry1 = harry.getObject();
. Kopien eines Objekts mit dem Wert zu einem anderen Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl
harry.getObject()
ist eine Referenz auf das original-Objekt ist, dann ruinieren Sie es mit der Zuordnung:führt, die eine Kopie.
Statt:
const
Referenz zurückgegeben. Soconst Student& harry1 = harry.getObject();
verwendet werden muss.Zuweisung der Referenz zurückgegeben
getObject
zu einemStudent
, so wird es kopiert nur ein paar Schritte später, wie in Code 1 (wo es kopiert werden direkt nach der Rückkehr ausgetObject
). Verwendenum einen Verweis auf harry. Beachten Sie, dass müssen Sie deklarieren und initialisieren von Referenzen in einem Schritt.
Sind Sie mit tatsächlichen Objekte, keine Pointer oder Referenzen. Wenn Sie sagen:
den Inhalt von harry, kopiert das default-Zuweisungsoperator in harry1.
harry1 in der test-code wird eine Instanz von Student, nicht eine Referenz. Ändern Sie diese:
Gemeinsam beraten : definieren Sie einen copy-Konstruktor, private und nicht implementiert:
Diese Weise, wenn Sie geschehen, um unerwünschtes kopieren, der compiler erkennt Sie (Ihre harry1 ist eigentlich eine Kopie). Und wenn Sie erwarten, dass Kopien haben, können Sie richtig Steuern, wie Sie gemacht werden, wodurch vermieden wird, um Durcheinander mit Potenzial Zeiger oder Objekte gekapselt.