Die Rückgabe per Referenz oder Konst-Referenz hat keine Geschwindigkeitsdifferenz - beide sind sehr schnell, da sie nur einen Verweis auf das Originalobjekt zurückgeben, es ist kein Kopieren beteiligt.
Ein Objekt, das von einer (nicht konstanten) Referenz zurückgegeben wird, kann über diese Referenz geändert werden. In Ihrem konkreten Beispiel ist mString
öffentlich, so dass es trotzdem (und direkt) geändert werden kann. Der übliche Ansatz mit Getter und Setter (und der Hauptgrund für ihre Einführung) ist die Kapselung - Sie erlauben nur den Zugriff auf Ihre Datenmitglieder über den Getter/Setter, so dass Sie ungültige Werte erkennen, auf Wertänderungen reagieren und reagieren können Halten Sie im Allgemeinen die Implementierungsdetails Ihrer Klasse verborgen. Getter kommen also normalerweise durch const Referenz oder nach Wert zurück.
Wenn Sie jedoch durch const-Verweis zurückgeben, bindet es Sie an immer halten Sie eine Instanz von std::string
in Ihrer Klasse, um die Referenz zu sichern. Das heißt, auch wenn Sie später Ihre Klasse so umgestalten möchten, dass sie die Zeichenfolge im Getter im Handumdrehen berechnet, anstatt sie intern zu speichern, können Sie dies nicht tun. Sie müssten gleichzeitig Ihre öffentliche Schnittstelle ändern, wodurch der Code unter Verwendung der Klasse beschädigt werden kann.Zum Beispiel, wie lange, wie Sie durch const-Referenz zurückkehren, ist dies absolut gültige Code:
const std::string *result = &aSample.Get();
Dieser Code wird natürlich
einen baumelnden Zeiger
nicht mehr kompilieren wenn Get()
produzieren wird durch Wert zurückzukehren geändert anstelle von const Referenz. (Danke an Steve Jessop für die Korrektur)
Zusammengefasst, der Ansatz, den ich nehmen würde, ist mString
privat zu machen. Get()
kann nach Wert oder durch const-Verweis zurückgegeben werden, je nachdem, wie sicher Sie sind, dass Sie immer eine Zeichenfolge gespeichert haben. Die Klasse würde dann wie folgt aussehen:
class sample
{
std::string mString;
public:
void Set(const std::string &s)
{
mString = s;
}
std::string Get() const
{
return mString;
}
};
"Dieser Code erzeugt natürlich einen ungeordneten Zeiger, wenn Get() geändert wird, um durch Wert anstelle von const-Verweis zurückzugeben." - nein es wird nicht, es wird aufhören zu kompilieren ("kann die Adresse eines temporären nicht nehmen"). Was ist besser als Kompilieren, aber mit UB. Eigentlich könnte * es aufgrund einer Erweiterung kompilieren, aber ich denke nicht, dass das eine allgemeine Erweiterung ist und der Standard immer noch eine Diagnose erfordert, so dass der Benutzer zumindest gewarnt werden sollte. –
@SteveJessop Danke, ich habe die Antwort korrigiert. – Angew