Rückkehr ein lokales Objekt aus einer Funktion
Ist das der richtige Weg ist, um ein Objekt wieder aus einer Funktion?
Car getCar(string model, int year) {
Car c(model, year);
return c;
}
void displayCar(Car &car) {
cout << car.getModel() << ", " << car.getYear() << endl;
}
displayCar(getCar("Honda", 1999));
Ich erhalte eine Fehlermeldung, "taking Adress of temporary". Sollte ich auf diese Weise:
Car &getCar(string model, int year) {
Car c(model, year);
return c;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
getCar
gibt eineCar
von Wert, das ist korrekt.Kann nicht übergeben werden, der Rückgabewert, der ein temporäres Objekt, in
displayCar
, weildisplayCar
dauertCar&
. Sie können nicht binden, vorübergehend auf einen nicht-const-Referenz. Sollten SiedisplayCar
zu nehmen, eine const-Referenz:Oder, Sie können speichern der temporären in eine lokale variable:
Aber, es ist besser
displayCar
nehmen eine const-Referenz, da es nicht ändern Sie das Objekt.Nicht Rückgabe eine Referenz auf die lokale
Car
variable.Car c = getCar(...)
mit einem Verweis auf const:const Car &c = getCar(...)
, wenn Sie nicht brauchen, um änderungen durchc
später auf.Dein problem ist:
sollten Sie eine const-Referenz:
Diese Funktion:
ist OK so wie es da steht, aber alle es tut, ist das, was der Konstruktor macht, so ist es redundant. Übergeben Sie einen Wert zurück, anstatt eine Referenz ist, ist die richtige Sache zu tun, für diese Typ Funktion, aber Die Modell-parameter übergeben werden sollen, durch die const Referenz:
In der Regel für Klasse Typen wie string oder Auto, die Standardeinstellung für einen parameter sollte immer einen const-Referenz.
Es ist nicht sicher, um wieder eine lokale variable, die die Referenz aus einer Funktion.
So, ja, das ist richtig:
return Car(model, year)
so dass keine weitere Kopie gemacht werden muß, so möchte ich loswerden das explizite lokale variable.new
Instanz und Rückkehr mit dem Zeiger. Ich würde empfehlen, verwenden Sie die entsprechende Art von smart-pointer, Lecks zu vermeiden.Ja, es ist definitiv nicht sicher für die Rückgabe einer Referenz oder einen Zeiger auf ein temporäres Objekt. Wenn es abgelaufen ist (dh, wenn die Funktion
getCar
beendet), werden Sie Links mit zu, was technisch bekannt als "dangling pointer".Allerdings, wenn Sie daran interessiert sind, auf die Verringerung der Kopier-Operationen auf ein Objekt, sollten Sie sich C++0x ' s "Move-Semantik". Es ist ein relativ neues Konzept, aber ich bin sicher, es wird sich main-stream schnell genug. GCC-4.4 aufwärts unterstützt C++0x (verwenden Sie die compiler-option
-std=c++0x
zu aktivieren).Sogar noch besser: