Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++: Verschiebesemantik

Einen Verschiebekonstruktor erstellen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Das Beispiel einer Klasse fürs Rechnen mit rationalen Zahlen verdeutlicht, wie Sie mit einem Konstruktor, der auf Verschiebesemantik setzt, in eigenen Klassen profitieren können.
05:36

Transkript

Um von der Verschiebesemantik in einer Ihrer eigenen Klassen zu profitieren, müssen Sie einen Verschiebekonstruktor erzeugen. Hier habe ich eine Arbeitskopie der Datei rational-01.cpp. Es handelt sich dabei um eine einfache Klasse für das Rechnen mit rationalen Zahlen. In die Klasse sind hilfreiche Ausgabeanweisungen eingefügt, um zu zeigen, wo Ihre Konstruktoren und Destruktoren aufgerufen werden. Und hier haben wir sie. Es gibt einen int-Konstruktor, einen int,int-Konstruktor, einen Kopierkonstruktor, und es gibt unseren Destruktor. Somit können wir die Abläufe verfolgen. Wenn ich das Projekt erstelle und ausführe, sehen Sie, dass ich hier unten in main einige rationale Zahlen erzeuge, einige Berechnungen mit ihnen anstelle und die Ergebnisse ausgebe. Und hier ist auch zu sehen, wo meine Konstruktoren aufgerufen werden. Und hier unten am Ende sehen wir fünf Destruktoren, die aufgerufen wurden. Gehen wir so weiter und fügen einen Verschiebekonstruktor hinzu, und sehen uns an, wie dies aussieht. Ich scrolle also nach oben, und hier, wo ich meinen Kopierkonstruktor habe, füge ich darunter einen weiteren Konstruktor ein. Und hier ist das doppelte "&&" zu beachten. Das heißt, dass das Argument ein R-Wert sein muss. Und das ist es, was dies zu einem Verschiebekonstruktor macht. Außerdem ist zu beachten, dass ich hier "NOEXCEPT" angebe. Dies ist eigentlich ein Makro. Normalerweise wäre es lediglich ein Schlüsselwort, "NOEXCEPT", wie hier. Leider unterstützt Microsoft Visual C++ dieses Schlüsselwort noch nicht. Die nächste Version wird es aber unterstützen. Ich arbeite mit der derzeit aktuellen Version 18. Ich muss also dieses Makro hier definieren. Dadurch funktioniert das Projekt mit demselben Code sowohl auf Microsoft als auch anderen Betriebssystemen. Und hier sehen Sie das "NOEXCEPT". Der NOEXCEPT-Modifizierer ist im Verschiebekonstruktor tatsächlich erforderlich. Er verhindert, dass Ausnahmen ausgelöst werden, wenn das Objekt in einem unbekannten Zustand verbleibt. Denn Ihr Compiler kann prinzipiell den Verschiebekonstruktor ignorieren, wenn er nicht mit NOEXCEPT deklariert ist. Wir sind also darauf angewiesen. Schreiben wir nun den Code für den Konstruktor. Wir setzen ihn unmittelbar hier unten hin. Und wieder werde ich das NOEXCEPT brauchen. Und ich muss es richtig schreiben, und zwar so: Als Erstes verschieben wir den Zähler und die Nenner. Der Zähler ist dieses "n", erst hier oben zu sehen. Zähler und Nenner sind hier in unserem privaten Datenbereich untergebracht. Ich verwende also die Funktion "std::move", um vom rhs, Right Hand Side, in unseren n zu verschieben. Das Gleiche mache ich mit "d" für den Zähler. Und dann rufe ich die Methode "reset" auf dem rhs auf. Das Ganze hat den Zweck, die Dinge in einen bekannten Zustand zu versetzen. Dies ist ein wichtiger Bestandteil eines Verschiebekonstruktors. Nachdem Sie die Daten aus Ihrer Quelle heraus verschoben haben, müssen Sie sicherstellen, dass Ihre Quelle in einem sinnvollen Standardzustand verbleibt. Und dafür ist dies hier auf dem rhs zuständig. Und dann gebe ich mit "move ctor" die Meldung aus, dass ich unseren Verschiebekonstruktor aufgerufen habe. Im Produktionscode ist dies zweifellos nicht erforderlich hier aber können wir besser verfolgen, wann der Verschiebekonstruktor verwendet wird. Ich werde das Projekt nun erstellen und ausführen. Und wie Sie sehen wurde unser Verschiebekonstruktor noch nicht aufgerufen. Also müssen wir tatsächlich irgendetwas zu einem R-Wert machen, damit sich das aufrufen lässt. Und so nehme ich das d hier, und sage: "std::move(c)". Und das sollte unser Verschiebekonstruktor sein. Und nun sehen Sie, dass unser Verschiebekonstruktor aufgerufen wird und c leer bleibt, Null über Eins. Nun kann ich den Wert zweifellos nicht zu Null über Null machen, weil das ja eine unzulässige Zahl ergeben würde, richtig? Und deshalb habe ich meine kleine Reset-Funktion hier oben, die Alles in einen vernünftigen Zustand versetzt. Der Wert "0" ist für den Nenner unzulässig, weil man nicht durch Null teilen darf. Der Verschiebekonstruktor kann unter manchen Umständen automatisch aufgerufen werden. Das ist zum Beispiel bei einer Funktion der Fall, die ein Irrational Object übernimmt und dieses Rational Object zurückgibt. Dann schreibe ich hier unten: "d" ist gleich "f(c)". Ich erstelle und starte das Projekt. Hier sehen Sie das Ergebnis für d. Es werden ein Kopierkonstruktor und ein Verschiebekonstruktor aufgerufen. Beim Aufruf von f dient also der Kopierkonstruktor dazu, dieses neue Objekt zu erzeugen. Doch das zurückgegebene Objekt ist ein temporäres Objekt ohne Namen. Wenn es also von der Funktion zurückgegeben wird, haben wir hier in dieser Zuweisung ein namenloses temporäres Objekt. Dieses ist dann automatisch ein R-Wert, und somit wird der Verschiebekonstruktor aufgerufen. Somit kommen wir zu einem Verschiebekonstruktor. Außerdem ist d eine Kopie von c, weil beim Aufruf der Funktion der Kopierkonstruktor aufgerufen wurde. Deshalb wird c auch nicht leer gelassen. Aber wir haben eine Kopie eingespart. Es gibt nun eine Kopie weniger als wenn wir unseren Verschiebekonstruktor nicht implementiert hätten. Ein Verschiebekonstruktor ist demnach ein wichtiges Element, um Verschiebesemantik zu unterstützen. Später in diesem Kapitel sehen wir uns noch einige andere Möglichkeiten an, um Verschiebesemantik zu unterstützen.

C++: Verschiebesemantik

Verstehen Sie die grundlegenden Konzepte und sehen Sie, wie Verschiebesemantik in der modernen C++Entwicklung funktioniert.

30 min (9 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:27.12.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!