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

C++ Grundkurs

Aufrufkontext einer Lambda-Funktion

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Lambda-Funktionen konservieren den Aufrufkontext der Funktion auf mehrere unterschiedliche Arten. Dies erfolgt entweder per Kopie oder per Referenz.
04:30

Transkript

In dieser Lektion will ich Ihnen Lambda-Funktionen als Closures vorstellen. Eine Lambda-Funktion kann in ihrem Funktionskörper Variablen ihrer Umgebung verwenden. Wenn sie diese Variablen verwendet, die einen Bezug zu diesen Variablen in drei verschiedenen Möglichkeiten herstellen. Zum Ersten keinen Bezug. Klar, wenn sie keinen benötigt. Die eckigen Klammern leiten eine Lambda-Funktion ein und wenn Sie in den eckigen Klammern keinen Parameter spezifizieren, hat die Lambda-Funktion keinen Bezug auf die aufgerufene Umgebung. Das ist nur dann möglich, wenn sie keine Variable der aufrufenden Umgebung verwendet. Verwenden Sie einen Namen wie hier a, verwendet sie die Umgebungsvariable per Kopie. Referenz von a, erzeugt sie eine Referenz drauf. Ist gleich, das heißt, alle Variablen, die sie verwendet, verwendet sie per Kopie. Das Und-Symbol, das heißt, alle Variablen, die sie verwendet, verwendet sie per Referenz und jetzt gibt es noch alle möglichen Kombinationsmöglichkeiten. =, &a bedeutet, per default verwendet sie alle Variablen per Kopie. a aber explizit per Referenz. Genau anders herum hier. Per default & per Referenz, a per Kopie. Hier gibt es noch etwas Besonderes. Wenn Sie die Lambda-Funktion innerhalb einer Klasse verwenden, kann diese Lambda-Funktion Bezug nehmen auf die Daten und Mitglieder der umgebenden Klasse. In diesen Bezug müssen Sie explizit durch this erzeugen. Durch den sogenannten this-Zeiger. Dieser Bezug ist per Referenz. Das will ich Ihnen jetzt alles in der Anwendung zeigen. Habe ich ein kleines Programm vorbereitet. Ich will hier bei der main-Funktion beginnen. Zwei Strings, std::string copy und std::sting ref. Beide haben den gleichen Wert, original, original. Jetzt definiere ich eine Lambda-Funktion und führe sie eine Zeile später aus. Ich binde Copy per Copy, Referenz per Referenz und gebe zurück Copy wie auch auch ref aus. Sie sehen, die Werte sind so, wie Sie sie erwarten: original, original. Hier führe ich die Lambda-Funktion aus. Noch ein kleines Wort zur Lambda-Funktion. Die Lambda-Funktion habe ich hier in place defniert. Damit ich sie weiter verwenden kann, an den Namen gebunden. Da mich der Typ der Lambda-Funktion nicht interessiert, habe ich auto verwendet. Die automatische Typableitung. Jetzt verändere ich copy auf changed und ref auf changed und führe Lambda noch einmal aus. Sie sehen, original bleibt original, weil das ist eine Kopie. ref wird aber zu changed, weil diese Lambda-Funktion ref dieses ref hier referenziert und damit sieht die Lambda-Funktion auch die Veränderung, die hier mit ref passiert, dass der Wert von ref auf changed gesetzt wird. Das war der Unterschied zwischen Capture bei copy und Capture bei ref oder bei Referenz. Jetzt noch zur Klasse, ClassMember cM. Von der rufe ich die Funktion show auf. Das will ich Ihnen gerne zeigen. Hier habe ich eine Klasse und will ich die Anwendung des this-Zeigers in Lambda-Funktionen vorstellen. In der Klasse habe ich im Wesentlichen eine Funktion show. Was macht die Funktion show? Die definiert die Lambda-Funktion, die einen String ausgibt. Den String, den sie ausgibt, ist this capture. In dem gibt sie aus get10(). get10() ist eine private Methode dieser Klasse. a ist eine statische Variable und val ist eine normale Variable. In diesem Fall auch mit dem Wert 1. Also get10() ergibt 10. a ergibt 1. val ergibt 1. Diese drei Werte addiert sie. Kommt 12 raus. Genau das sehen Sie hier. Wenn ich cM.show aufrufe, kommt 12 raus. Noch zwei Besonderheiten, wie gesagt, ich verwende hier den this-Zeiger. Damit kann ich einen Bezug zu der umgebenden Klasse herstellen, sonst wäre das syntaktisch hier falsch. Zweitens ich rufe nur die Funktion show auf. Die Funktion ruft die Lambda-Funktion auf. Sie sehen, was ich hier mache. Ich mache es noch einmal anders. Hier definiere ich eine Lambda-Funktion ohne die runden Klammern und hier rufe ich sie in place auf. Das geht also auch und das Ergebnis sehen Sie natürlich nochmal hier. In dieser Lektion habe ich Ihnen Lambda-Funktionen als Closures vorgestellt. Das Besondere ist, dass eine Lambda-Funktion ihren Aufrufkontext reservieren kann. Aufrufkontext heißt, eine Lambda-Funktion kann diese Variablen binden, die sie verwendet. Diese Bindung ist per Kopie oder per Referenz möglich. Sie ist auch möglich, wenn eine Lambda-Funktion innerhalb einer Klasse definiert wird. Dann kann sie sich an die umgebende Klasse mit dem this-Pointer binden.

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!