Ich bin jetzt wirklich verwirrt darüber, wie und welche Methode verwendet wird, um Objekt von einer Funktion zurückzugeben. Ich möchte Feedback zu den Lösungen für die gegebenen Anforderungen bekommen.Zurückkehrendes Objekt von der Funktion
Szenario A: Das zurückgegebene Objekt soll in einer Variablen gespeichert werden, die während ihrer Lebensdauer nicht geändert werden muss. Somit
const Foo SomeClass::GetFoo() {
return Foo();
}
als aufgerufen:
someMethod() {
const Foo& l_Foo = someClassPInstance->GetFoo();
//...
}
Scneraio B: Das zurückgegebene Objekt wird in einer Variablen gespeichert werden, die während der Laufzeit geändert werden. So
void SomeClass::GetFoo(Foo& a_Foo_ref) {
a_Foo_ref = Foo();
}
als aufgerufen:
someMethod() {
Foo l_Foo;
someClassPInstance->GetFoo(l_Foo);
//...
}
ich eine Frage habe hier: Lassen Sie uns sagen, dass Foo nicht über einen Standardkonstruktor verfügen kann. Dann, wie würden Sie, dass in dieser Situation umgehen, da wir dies nicht mehr schreiben kann nicht:
Foo l_Foo
Szenario C:
Foo SomeClass::GetFoo() {
return Foo();
}
aufgerufen, wie:
someMethod() {
Foo l_Foo = someClassPInstance->GetFoo();
//...
}
Ich denke, Dies ist nicht der empfohlene Ansatz, da hierfür zusätzliche Provisorien erstellt werden müssen.
Was denkst du? Empfiehlst du dir stattdessen einen besseren Weg dies zu handhaben?
http://en.wikipedia.org/wiki/Return_value_optimization – vladr
Szenario A ist in Ordnung, aber wirklich keine Verbesserung gegenüber C.Ich würde C verwenden, es sei denn Foo's Standardkonstruktor ist "schnell", Foo's Kopie ist "langsam" und Sie wollen nicht darauf vertrauen, dass der Compiler schlau genug ist, um unnötige Kopien zu vermeiden, in welchem Fall B auch akzeptabel ist. – sellibitze
Beachten Sie, dass 'a_Foo_ref = Foo();' Objekt erstellt und die Kopie ausführt. Es entspricht fast dem letzten Szenario – Anycorn