Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Ähnliche Dokumente
Grundkurs C++ IDE Klassenhierarchien

Grundkurs C++ IDE Klassenhierarchien

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Programmierung und Angewandte Mathematik

C++ - Objektorientierte Programmierung Vererbung

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Vererbung und Polymorphie

Einstieg in die Informatik mit Java

Konstruktor/Destruktor

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Prof. W. Henrich Seite 1

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };

Vererbung, Polymorphie

Praxisorientierte Einführung in C++ Lektion: "Das Schlüsselwort explicit"

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Polymorphismus 179. Function.h. #include <string>

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Rückblick: Benutzerdefinierte Datentypen Definition der Klasse Vektor als Container für 2-dimensionale Vektoren

Einführung in C++ mit Microsoft VS

Objektorientierte Programmierung mit C++ SS 2007

Einstieg in die Informatik mit Java

7. Übung Informatik II - Objektorientierte Programmierung

Programmierkurs C/C++

1.4. Funktionen. Objektorientierte Programmierung mit C++

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Prinzipien der objektorientierten Programmierung (OOP)

Einstieg in die Informatik mit Java

kurze Wiederholung class templates

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Vorkurs C++ Programmierung

Vorlesung Datenstrukturen

OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

1 Klassen und Objekte

Fragen zur OOP in Java

Programmierkurs C++ Templates & STL (1/2)

Programmieren in Java

Programmieren - C++ Templates

3 Objektorientierte Konzepte in Java

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

12 Abstrakte Klassen, finale Klassen und Interfaces

11 Vererbung und Klassenhierarchie

Einführung in C# Teil 3. Matthias Nübling

Lambda-Ausdrücke in Programmiersprachen 76

Java, OO und UML Fortsetzung

Programmieren in C++ Überladen von Methoden und Operatoren

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

C++-Zusammenfassung. H. Schaudt. August 18, 2005

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Einstieg in die Informatik mit Java

Programmieren in Java -Eingangstest-

6. Globalübung (zu Übungsblatt 8)

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Objektorientierte Programmierung und Klassen

Modernes C++ (C++11)

Java Vererbung. Inhalt

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Grundlagen der Informatik Vererbung von Klassen

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Crashkurs C++ Wiederholung

Objektorientierte Programmierung Studiengang Medieninformatik

Dynamische Datentypen

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

1 Abstrakte Klassen, finale Klassen und Interfaces

11.3 Virtuelle Methoden

Alltagsnotizen eines Softwareentwicklers

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Transkript:

Lambda-Funktionen Lambda-Funktionen sind Funktionen ohne Namen. definieren ihre Funktionalität an Ort und Stelle. können wie Daten kopiert werden. können ihren Aufrufkontext speichern. Lambda-Funktionen sollen kurz und knackig sein. selbsterklärend sein. 1

Lambda-Funktionen: Syntax []: Bindung der verwendeten Variablen per Copy oder Referenz möglich (): Bei Parametern notwendig ->: Bei komplexeren Lambda-Funktionen notwendig {}: Funktionskörper, per Default const []() mutable -> {...} besitz einen nicht-konstanten Funktionskörper 2

Lambda-Funktionen: Closure Lambda-Funktionen können ihren Aufrufkontext binden. Bindung Closure Beschreibung [] Kein Bezug [a] [&a] a per Kopie a per Referenz [=] Alle verwendeten Variablen per Kopie [&] Alle verwendeten Variablen per Referenz [=, &a] Standardmäßig per Kopie; a per Referenz [&, a] [this] Standardmäßig per Referenz; a per Kopie Daten und Mitglieder der umgebenden Klasse per Kopie [l = std::move(lock)] Verschiebt lock (C++14) 3

Lambda-Funktionen: First-Class-Function Lambda-Funktionen können sowohl in Variablen gespeichert, als auch als Argument oder Rückgabewert einer Funktion verwendet werden. First-Class-Function auto addtwonumber= [](int a, int b){return a + b;}; std::thread th([]{std::cout << "Hello from thread" << std::endl;}); std::function<int(int, int)> makeadd(){ } return [](int a, int b){return a + b;}; std::function<int(int,int)> myadd= makeadd(); myadd(2000, 11); // 2011 4

Lambda-Funktionen: Implementierung Eine Lambda-Funktion entspricht einem Funktionsobjekt, das an Ort und Stelle implizit definiert und instanziiert wird. auto add= [](int a, int b){ } return a+b; class TmpAdd{ public: int operator()(int a, int b) const{ return a + b; } TmpAdd tmpadd; add(2000, 11); // 2011 tmpadd(2000, 11); // 2011 5

Generische Lambda-Funktionen: C++14 In C++14 können Lambda-Funktionen den Typ ihrer Argumente automatisch bestimmen. auto add11 =[](int i, int i2){return i + i2;}; auto add14 = [](auto i, auto i2){return i + i2;}; std::vector<int> myvec{1, 2, 3, 4, 5}; auto res11 = std::accumulate(myvec.begin(), myvec.end(), 0, add11); auto res14 = std::accumulate(myvec.begin(), myvec.end(), 0, add14); // res11 == res14 == 15; std::vector<std::string> myvecstr{"hello"s, " World"s}; auto st = std::accumulate(myvecstr.begin(), myvecstr.end(), ""s, add14); std::cout << st << std::endl; // Hello World 6

Lambda-Funktionen Beispiele: lambdafunction.cpp lambdafunctionclosure.cpp lambdafunctioncapture.cpp lambdafunctionthis.cpp lambdafunctiongeneric.cpp Aufgaben: Das Programm lambdafunctioncapture.cpp besitzt undefiniertes Verhalten. Korrigieren Sie das Programm. Lösung: lambdafunctioncapture.cpp Die Regeln rund um Lambda-Funktionen werden schnell anspruchsvoll. Überzeugen Sie sich. Weitere Informationen: Lambda-Funktionen 7

Vereinheitlichte Initialisierung mit { } Grundregel: Eine { }-Initialisierung ist in allen Initialisierungen anwendbar. Zwei Formen: Direkte Initialisierung string str{"my String"}; Kopierinitialisierung string str ={"my String"}; 8

Vereinheitlichte Initialisierung mit { } Die Initialisierung mit { } erlaubt keine Verengung (narrowing). Heimlicher Verlust der Datengenauigkeit. int i1(3.14); int i2{3.14}; int i3 = {3.14}; // OK // ERROR // ERROR char c1(999); char c2{999}; // OK // ERROR char c3{8}; // OK 9

Initialisiererlisten für Konstruktoren Initialisiererlisten für Konstruktoren erlauben das einfache und direkte Initialisieren der Container der STL. Initialisiererlisten: std::initializer_list<type> leichtgewichtiger Proxy um eine Array von Objekten besitzen die drei Methoden begin, end und size benötigen die Header-Datei <initializer_list> Beispiele: std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9}; std::map<std::string, int> mymap{{"c++98", 1998}, {"C++11", 2011}}; for (int i: {1, 2, 3, 4, 5}) std::cout << i << " "; // 1 2 3 4 5 10

Vereinheitlichte Initialisierung mit { } Initialisiererlisten für Konstruktoren ermöglichen neue Anwendungsfälle. Container der STL std::vector<int> intvec{1, 2, 3, 4, 5}; Konstante Heap-Array const float* p = new const float[2]{1.2, 2.1}; Konstantes C-Array als Attribut einer Klasse struct MyArray{ }; MyArray(): data{1, 2, 3, 4, 5}{} const int data[5]; Default-Initialisierung eines beliebigen Objekts std::string s{}; Initialisieren eines beliebigen Objekts MyClass class{2011, 3.14}; 11

Sequenzkonstruktor Ein Sequenzkonstruktor ist ein Konstruktor, der eine Initialisiererliste annimmt. Ein Sequenzkonstruktor besitzt eine höhere Präzedenz als ein klassischer Konstruktor. ist für die Container der STL definiert. lässt sich für eigene Datentypen definieren. Sequenzkonstruktor für den std::vector template<typename T> class vector{ public: vector(std::initializer_list<t> inlist){... Funktionen können auch Initialisiererlisten annehmen. 12

Vereinheitlichte Initialisierung Beispiele: uniforminitialization.cpp initializerlist.cpp Aufgaben: Initialisieren Sie die verschiedenen Container std::array, std::vector, std::set und std::unordered_set mit der {-10, 5, 1, 4, 5} -Initialisiererliste. Lösung: initializerlist.cpp Weitere Informationen: std::initializer_list 13

Konstruktoren: Delegation Ein Konstruktor kann einen anderen Konstruktor der gleichen Klasse aufrufen. Dieser Konstruktor muss in der Klassen-Initialisiererliste spezifiziert werden. struct Account{ Account(): Account(0.0){} Account (double b): balance(b){} }; Regeln: Sobald der erste Konstruktor fertig ist, ist das Objekt konstruiert. Konstruktoren dürfen nicht direkt oder indirekt rekursiv aufgerufen werden. undefined behaviour Idee: Gemeinsame Initialisierungsaufgaben können in einem Konstruktor implementiert und von allen anderen Konstruktoren verwendet werden. 14

Konstruktor: Delegation Beispiele: constructordelegation.cpp Aufgaben: Schreiben Sie eine Klasse, in der sich Konstruktoren rekursive aufrufen. Was passiert? Lösung: constructordelegationrecursive.cpp 15

Konstruktoren: Vererbung Durch die using-deklaration erbt eine Klasse alle Konstruktoren ihrer direkten Basisklasse. Der Default-Konstruktor, der Copy- und Move- Konstruktor wird nicht vererbt. class Account{ public: Account(double amount){}; }; class BankAccount: public Account{ public: using Account::Account; }; BankAccount bankaccount(100.0); 16

Konstruktoren: Vererbung Die abgeleitete Klasse erbt alle Charakteristiken des Konstruktors: public, protected und private Zugriffsbeschränkungen explicit und constexpr Deklarationen Default-Argumente für Parameter eines Basisklassenkonstruktors werden nicht vererbt. Die abgeleitete Klasse erhält einen zusätzlichen Konstruktor, der einen Parameter für das Default-Argument enthält. Konstruktoren mit denselben Parametern wie die abgeleitete Klasse, werden nicht vererbt. Das Vererben von Konstruktoren birgt die Gefahr, dass ein Attribut in der erbenden Klasse nicht initialisiert wird. 17

Konstruktor: Vererbung Beispiele: constructorinheriting.cpp Aufgaben: Leiten Sie public, protected und private von einer Klasse ab und verwenden Sie das Vererben von Konstruktoren. Die geerbte Konstruktoren der Basisklasse behalten ihre Sichtbarkeit. Die abgeleitete Klasse schränkt ihr Sichtbarkeit ein. Was bedeutet das für die Sichtbarkeit der geerbten Konstruktoren? Lösung: constructorinheriting.cpp 18