Ein Objekt einer Klasse von einer Funktion nach Wert zurückgeben
Betrachten Sie den Fall, in dem Sie ein Objekt einer Klasse aus einer Funktion nach zurückgeben Wert. In diesem Szenario wird das zurückgegebene Objekt normalerweise als L-Wert betrachtet, was bedeutet, dass es einen Namen und eine Adresse im Speicher hat. Bestimmte Umstände können jedoch dazu führen, dass das zurückgegebene Objekt als R-Wert behandelt wird, ein temporäres Objekt ohne Namen oder Adresse.
Die implizite Verschiebungsregel
C definiert ein implizite Verschiebungsregel, die bei der Rückgabe eines Objekts nach Wert angewendet werden kann. Diese Regel besagt, dass, wenn die folgenden Bedingungen erfüllt sind:
In solchen Fällen wird der Verschiebungskonstruktor anstelle des Kopierkonstruktors aufgerufen. Dieses Verhalten soll die Leistung optimieren, indem unnötiges Kopieren vermieden wird.
Beispiel 1
In diesem Beispiel ist das zurückgegebene Objekt i ein L-Wert, daher testet der Kopierkonstruktor( const test& z) wird aufgerufen:
class test {
public:
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(const test& z) { printf("test(const test&z)\n"); }
};
test Some_thing() {
test i;
return i;
}
Ausgabe:
test() test(const test&z)
Beispiel 2
Im folgenden Beispiel wird das zurückgegebene Objekt i jedoch als x-Wert behandelt und der Verschiebungskonstruktor test( test&& s) wird aufgerufen, weil das Objekt temporär ist und der Verschiebungskonstruktor realisierbar ist:
class test {
public:
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(test&& s) { printf("test(test&& s)\n"); }
};
test Some_thing() {
test i;
return i;
}
Ausgabe:
test() test(test&& s)
Beispiel 3
Wenn kein Verschiebungskonstruktor bereitgestellt oder explizit gelöscht wird, kann die implizite Verschiebungsregel nicht angewendet werden und die Das Programm kann nicht kompiliert werden:
class test {
public:
test(test&& z) = delete;
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(const test& z) { printf("test(const test&z)\n"); }
};
test Some_thing() {
test i;
return i;
}
Schlussfolgerung
Bei der Rückgabe eines Objekts nach Wert kann die implizite Verschiebungsregel unter bestimmten Bedingungen angewendet werden, was dazu führt, dass der Verschiebungskonstruktor aufgerufen wird. Das Verständnis dieses Verhaltens ist entscheidend für die Optimierung des Codes und die Vermeidung von Kompilierungsfehlern.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3