Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++ Grundkurs

Zuweisungsoperator

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Programmiersprache benötigt einen Zuweisungsoperator, um ein Objekt einem anderen zuzuweisen. Dieser steht in zwei unterschiedlichen Varianten zur Auswahl.
04:07

Transkript

In dieser Lektion will ich Ihnen "Zuweisungsoperator" in "C++" genauer vorstellen. Den Zuweisungsoperator gibt es in zwei Formen in "C++", als "Copy-" und als "Move-Zuweisungsoperator". Der Zuweisungsoperator ist ein besonderer Operator in C++. Einerseits kann er nur als Methode überladen werden und andererseits wird er nicht weitervererbt. Der "Copy- und Move-Zuweisungsoperator" folgt einer Syntax und einer Semantik sehr streng dem "Copy/Move-Konstruktor". Das ist aber relativ nahe liegend. Was macht ein Zuweisungsoperator? Er nimmt ein bestehendes Objekt und weist seine Werte einem neuen Objekt zu. Was macht der Copy/Move-Konstruktor? Der nimmt ein bestehendes Objekt und erzeugt damit ein neues Objekt. Dementsprechend sollte der Copy/Move-Zuweisungsoperator in seiner Art auch dem Copy/Move-Konstruktor folgen. Das heißt, insbesondere beim Move-Zuweisungsoperator er sollte zuerst die Attribute des neuen Objektes setzen. Dann den Inhalt des alten Objektes in das neue Objekt verschieben und zuletzt die Attribute des alten Objekts auf ihre Default-Werte setzen. Dann verhält es sich anständig. Der Copy-Zuweisungsoperator wird per default vom Compiler erzeugt. Das ist relativ nahe liegend. Beim Move-Zuweisungsoperator ist es deutlich anspruchsvoller. Der wird nur dann erzeugt, falls alle Attribute der Klasse und Basis- klasse eine "Move-Zuweisung" unterstützen und die Klasse kein "Copy/Move-Zuweisungsoperator" oder keinen "Copy/Move-Konstruktor" oder keinen "Destruktor" besitzt. Das sind also relativ restriktive Bedingungen. Jetzt will ich Ihnen die Theorie noch in der Praxis zeigen. Die bekannte Klasse "Account". Die Klasse Account hat zwei überladene "Operatoren" und einen "Konstruktor". Der erste Konstruktor wird mit natürlichen Zahlen "numb" gefüttert. Was passiert dann? Er speichert sich die Zahl und erzeugt ein "Array" von Doubles der Länge "numb". "numb" soll die Anzahl der Depots symbolisieren. Hier habe ich jetzt den Zuweisungsoperator per "const"-Referenz und hier den Zuweisungsoperator per "Rvalue"-Referenz. Zuerst den ersteren. Was macht der Zuweisungsoperator? Der nimmt mit der Zuweisung das rechte Objekt, das "other". Nimmt "numberOf", die Anzahl der Elemente, und erzeugt ein neues "Array" von Double, eben mit dieser Anzahl von Elementen, Anzahl von Depots und zum Schluss kopiert er noch alle Werte vom rechten Wert. "other.deposits" + "other.numberof.deposits" nach deposits. Damit wird also in Account ein neues Array von Double erzeugt, das die Werte besitzt von other. Was macht hingegen der Move-Zuweisungsoperator? Der macht relativ wenig. Der weist die Werte zu. Der weist sowohl die Zahl zu, die Anzahl der Depots, als auch den Zeiger. Setzt dann den ursprünglichen Zeiger auf einen "Null-Pointer" und die Zahl auf 0. Das ist eben so, wie sich ein Move-Zuweisungsoperator verhalten sollte und das war schon alles, was er getan hat. Der Unterschied ist gravierender, wenn wir uns hier die Performance anschauen. Die Ausgabe ein bisschen optimiert. Weil die Zahlen ziemlich klein werden, habe ich die Präzision auf zehn Nachkommastellen gesetzt und andererseits will ich keine wissenschaftliche Notation haben. Jetzt erzeuge ich zwei Accounts. Eines mit 100 Millionen Objekten und eines mit 50 Millionen Objekten von Typ double. Hier wende ich die Funktion "std:.chrono::system_clock" an, um die aktuelle Zeit zu bestimmen. Speichere es mir in "start". Mache dann hier meine Copy-Zuweisung, indem ich "account2" "account" zuweise und bemesse hier noch einmal die Zeit. Ziehe die ursprüngliche Zeit ab und das Ergebnis ist die Differenz und Sie sehen, wenn ich das ausführe, hier sind wir, im Copy-Fall dauert es ungefähr eine knappe halbe Sekunde. Das gleiche Spielchen mit der "Move-Zuweisung". Wieder aktuelle Uhrzeit bestimmen. Diesmal verwende ich die Funktion der "Standard Template Library" "std::move", um eben mit Verschieben oder ein "Moven" explizit anzufordern. Sie sehen hier, wenn ich mir die Zeit ausgebe, kommt was Kleines raus. Zu klein, um gemessen zu werden. In dieser Lektion habe ich Ihnen den "Copy-" und den "Move-Zuweisungsoperator" vorgestellt, der in seiner Syntax und Semantik sehr dem "Copy- und Move-Konstruktor" folgt.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

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!