Verzeihen Sie mir, wenn das schon einmal gefragt wurde, ich bin sicher, dass es hat, aber ich konnte keine Antwort finden, mit der ich glücklich war.Zurückgeben von Zeichenfolgen durch Referenz cpp
Ich komme zu cpp von einem schweren Java-Hintergrund und möchte verstehen, wenn einen Verweis/Zeiger auf ein Objekt anstelle einer Kopie zurückgeben.
für die folgende Klassendefinition:
class SpaceShip {
string name;
WeaponSystem weaponSystem; //represents some object, this is just an example, I dont have this type of object at all in my program
int hull;
string GetName() const {
return name;
}
WeaponSystem GetWeaponSystem() const {
return weaponSystem;
}
int GetHull() const {
return hull;
}
};
Ich weiß, dass eine Kopie der Dinge Rückkehr teuer ist, würde ich denke, das bedeutet, dass ich so etwas wie eine Schnur oder weaponSystem von Wert vermeiden will zurückkehren, sondern ein int nach Wert ist ok.
Ist das richtig? Ich weiß auch, dass ich mir bewusst sein muss, wo Dinge in Erinnerung bleiben, bedeutet die Rückkehr zu etwas in dieser Klasse Gefahr auf der ganzen Linie, wenn dieses Objekt zerstört wird und etwas noch einen Verweis auf seinen Namen besitzt?
im Allgemeinen; Solange Sie kein * new * (Zuweisung eines Speicherorts auf dem Heap) verwenden, müssen Sie sich keine Gedanken über Speicherlecks machen. – Rps
Während Sie Referenzen hier zurückgeben könnten, würde dies die Kapselung verletzen und zu undefiniertem Verhalten führen. Angenommen, Sie geben einen Verweis auf 'name' zurück und zerstören dann die' SpaceShip' -Instanz, dann hätten Sie jetzt einen veralteten Verweis auf den jetzt zerstörten 'name'. –
in C++ 11 Rückgabe von By-Wert ist nicht unbedingt eine schlechte Wahl, und es nicht notwendigerweise auch kopieren. Es gibt _move semantics_ in C++ 11 für alle Standard-Bibliothekstypen implementiert (einschließlich String, Vektor usw.).Es gibt genügend Feinheiten in der C++ - Sprache, wobei einige Szenarien existieren, die eine "Rückgabe nach Wert" effizienter machen als eine "Weitergabe nach Referenz" (aufgrund verschiedener Macken mit temporären Kopien). Für einfache Get-Member-Funktionen ist es jedoch am sinnvollsten, mit reference-to-const zurückzukehren. –