Kann mir jemand die 5. Zeile der Ausgabe erklären? Ich verstehe nicht, warum das MyClass
Objekt b
nicht erhaltenes Objekt c
von func
zugewiesen bekommen.Warum bekomme ich in diesem Code keine Rückgabewertoptimierung?
class MyClass
{
public:
int x;
std::string s;
MyClass(const MyClass &other);
MyClass();
void output();
};
MyClass::MyClass(const MyClass &other): x(2), s("s?") { }
MyClass::MyClass() : x(1), s("s1") { }
void MyClass::output() { cout << x << " " << s << endl; }
MyClass func(MyClass c) //MyClass c = Myclass(a)
{
cout << "2. in func: "; c.output();
c.s = "s2";
cout << "3. in func: "; c.output();
return c;
}
int main()
{
MyClass a;
cout << "1. "; a.output();
MyClass b = func(a);
cout << "4. "; a.output();
cout << "5. "; b.output();
}
Die Ausgabe lautet:
1. 1 s1
2. in func: 2 s?
3. in func: 2 s2
4. 1 s1
5. 2 s?
Ich verstehe, wo 1-4 aus tun Linien kommen, aber ich bekomme am Ende nicht, warum hat die MyClass b.s
einen Wert von s?
nicht die s2
. Liegt es daran, dass das Objekt const
innerhalb des Bereichs func
erstellt wurde?
EDIT: Ich weiß, dass der Kopierkonstruktor aufgerufen wird, wenn MyClass c
Objekt innerhalb des func
Umfang initialisiert wird, aber wie das zurückgegebene Objekt zugewiesen ist nicht auf b
?
es nicht s2 ist, weil 'MyClass b = func (a);' den Copykonstruktor 'b' für Anrufe, die initialisiert das string-Mitglied zu 's?' –
Ich denke, Sie müssen möglicherweise klären, warum Sie von der Ausgabe überrascht sind. Ihre Frage ist subtiler, als Sie wahrscheinlich wissen, und keine der Antworten hat das aufgegriffen.Tipp: Ein alternativer Titel könnte lauten: "Warum bekomme ich in diesem Code keine * Rückgabewertoptimierung *?" – juanchopanza
@juanchopanza das ist fertig, danke –