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++ Grundkurs

Methoden unterdrücken

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Das Schlüsselwort delete fordert den Compiler dazu auf, bestimmte Methoden und Funktionen nicht zur Verfügung zu stellen.
04:15

Transkript

In dieser Lektion möchte ich Methoden unterdrücken mit *delete* genauer vorstellen. Durch *delete* lässt sich rein deklarativ erklären, dass eine automatisch vom Compiler erzeugte Methode nicht zur Verfügung steht. Gerade in Kombination mit *default* lassen sich so sehr interessante Klassen erzeugen, deren Objekte nicht kopiert werden können, nur auf dem Stack oder nur auf dem Heap angelegt werden können. Das werde ich gleich in der Anwendung zeigen. Das Besondere an *delete* im Gegensatz zu *default* ist, dass *delete* sich auch auf freie Funktionen anwenden lässt. Auch das werde ich zeigen. Hier habe ich einen Klasse *OnlyMove* und Objekte der Klasse tun genau das, was die Klasse verspricht, sie lassen sich nur moven, sprich verschieben. Wie erreiche ich das? Als erstes erzeuge ich einen Default-Konstruktor. Den benötige ich, denn sobald ich einen Copy- oder Move-Konstruktor erzeuge, besitze ich automatisch keinen Default-Konstruktor mehr. Darum habe ich ihn auf *default* gesetzt. Hier unterdrücke ich das Aufrufen des Copy-Konstruktor und hier unterdrücke ich das Aufrufen des Copy-Zuweisungsoperators. Hier fordere ich explizit den Move-Zuweisungsoperator an. Hier fordere ich explizit den Copy-Zuweisungsoperator an. Der feine Unterschied ist, dass die Move-Version um eine nicht konstante *Rvalue*-Referenz, die Copy-Version dagegen eine konstante *Lvalue*-Referenz. Das zeige ich in einem Anwendungsfall, bevor ich dann ein Stückchen weitergehe. Hier erzeuge ich *OnlyMove*-Instanz. Die kann ich verschieben, aber nicht kopieren. Ich zeige Ihnen das Programm gleich in der Anwendung. Zum nächsten Fall *OnlyOnStack*. Instanzen vom Typ *OnlyOnStack* lassen sich nur auf einen Stack anlegen. Wie kann ich das erreichen? Indem ich den Operator *new* auf *delete* setze. Ich kann kein Objekt mehr auf den Heap oder den freien Speicher anlegen und dadurch kann ich *OnlyOnStack* nur auf den Stack und nicht mehr auf den Heap anlegen. Das Gegenteil erreiche ich mit *OnlyOnHeap*. In OnlyOnHeap setzte ich den Destruktor auf *delete*. Wie funktioniert das? Der C-Compiler will für automatisch erzeugte Objekte den Destruktor automatisch aufrufen. Das kann ich hier nicht mehr, weil ich ihn auf *delete* setze. Daher kann ich *OnlyOnHeap* nur auf den Heap erzeugen, auf dem freien Speicher, hingegen nicht mehr auf dem Stack. Zuletzt noch eine freie Funktion *onlyDouble*. Das ist eine ganz einfache Funktion. Die erwartet ein wahres Argument in *double* und gibt ein *void* zurück. Die Funktion erwartet ein *double* und jetzt definiere ich hier unten ein Funktions-Template. Das Besondere an einem Funktions-Template ist, dass es den gleichen Namen besitzt wie die freie Funktion oben. Was passiert jetzt, wenn ich *onlyDouble* mit *double* aufrufe? Zieht der Compiler die freie Funktion vor. Für alle anderen Typen verwendet er *double* das Funktions-Template. Das habe ich aber auf *delete* gesetzt. Das Ergebnis ist, dass ich *onlyDouble* nur mit *double* aufrufen kann, aber nicht mit 2011, was sich natürlich automatisch nach *double* propagieren ließe. Jetzt zeige ich Ihnen das Programm in der Anwendung. Als erstes den Gutfall. Sie sehen, das Programm lässt sich übersetzen und es läuft auch, wenn auch die Ausgabe nicht besonders aussagekräftig ist. Jetzt der andere Fall. Ich kommentiere die Zeilen ein, die vom Compiler zurückgewiesen werden sollten. Ich speichere es ab. Übersetze jetzt und Sie sehen, der Compiler gibt eine schöne Fehlermeldung. Sehr schön bezogen auf C++. Hier sagt er in Zeile 33, das sehen wir hier, *use of deleted function* ‘OnlyMove(const OnlyMove&)‘. Hier verwende ich den Copy-Konstruktor. Den habe ich auf *delete* gesetzt. Hier verwende ich den Operator *new*. Den habe ich auch auf *delete* gesetzt. In Zeile 39 will ich den Default-Destruktor verwenden. Den habe ich auf *delete* gesetzt. Und sehr schön ist auch dieser Fall mit der freien Funktion *onlyDouble*. Hier sagt er mir sogar, Du hast *onlyDouble* mit *int* aufgerufen und das geht nicht gut, weil *onlyDouble* für *int* ist auf *delete* gesetzt. In dieser Lektion habe ich das Unterdrücken von Methoden mit *delete* vorgestellt. Ich bin besonders darauf eingegangen, wie man Klassen definiert, die sich nur auf den Heap oder auf den Stack anlegen lassen. Die in diesem Fall nur verschiebbar, sprich die Move-Semantik unterstützen. Genauso gut hätte ich eine Klasse anlegen können, die nur kopierbar ist, sprich die Copy-Semantik unterstützt.

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!