Semantics of C++ Seminar Wintersemester 2009/2010. RValue-Referenzen. Martin Sevenich. 6. Dezember 2009

Größe: px
Ab Seite anzeigen:

Download "Semantics of C++ Seminar Wintersemester 2009/2010. RValue-Referenzen. Martin Sevenich. 6. Dezember 2009"

Transkript

1 Semantics of C++ Seminar Wintersemester 2009/2010 RValue-Referenzen Martin Sevenich 6. Dezember 2009 Zusammenfassung Dieser Artikel befasst sich mit den neuen RValue-Referenzen, die mit dem kommenden C++0x-Standard eingeführt werden. Betrachtet werden dabei die Unterschiede zwischen L- und RValues, sowie die Anwendungsmöglichkeiten der RValue-Referenzen, die anhand von anschaulichen Beispielen vorgestellt werden. 1

2 1 Einleitung Mit C++0x wird derzeit ein neuer Standard für C++ entwickelt, der einige tief greifende Erweiterungen für den Sprachkern und die Standard Template Library (STL) mit sich bringen wird. Damit soll der alte Standard von 1998 bzw abgelöst werden. Eigentlich sollte C++0x bereits 2009 veröffentlicht werden, allerdings wird er wohl vorraussichtlich nicht vor Ende 2010 erscheinen. Unter den neuen Spracherweiterungen befinden sich unter anderem Typinferenzen und RValue-Referenzen, wobei letztere einige Probleme von C++98 mittels Move-Semantiken und Perfect-Forwarding lösen sollen.[2] Die folgende Abhandlung wird sich genauer mit ihnen befassen, indem sie zuerst eine kurze Einführung in R- und LValues gibt und schließlich die Anwendungsmöglichkeiten der neuen Referenzen vorstellt. 2 Einführung Laut dem C++-Standard ist jeder Ausdruck entweder ein LValue oder ein RValue. Um Verwirrungen zu vermeiden, muss man sich darüber klar werden, dass es nicht vom Objekt abhängt worum es sich handelt, sondern nur vom Ausdruck.[1] Ein LValue bezeichnet einen Ausdruck, der auch nach dem Anweisungsende noch existiert, der also den Strichpunkt überlebt. Zwar bedeutet LValue Left- Value, dennoch können LValues auf beiden Seiten einer Zuweisung stehen. Beispiele: 1 Object myobj ; //myobj i s t ein LValue 2 Object& myref = myobj ; // myref i s t e i n LValue 3 Object myptr ; //myptr i s t ein LValue ; 4 myobj = ( myptr + 42) ; // ( myptr + 42) i s t e i n LValue 5 myobj = (++myptr ) ; //++myptr i s t ein LValue RValues hingegen sind temporäre Objekte die auf dem Stack erzeugt werden und nach dem Ende der Anweisung verschwunden sind, also gelöscht werden. Sie sind also an keiner Stelle des Programms mehr verfügbar. Analog zu 2

3 LValues steht RValue für Right-Value, da sie nur auf der rechten Seite einer Zuweisung vorkommen können. Beispiele: 1 int x (123) ; // 123 i s t ein RValue 2 int z = 2 x ; // 2 x i s t ein RValue 3 z = x++; // x++ i s t ein RValue 4 s t r i n g s = Banane ; // Banane i s t ein RValue Als kleine Hilfe zur Unterscheidung von R- und LValues kann folgendes dienen:[1] Ist es möglich, die Adresse eines Ausdruckes zu bestimmen, bzw. lässt es der Compiler zu, so ist es ein LValue. Anhand der obigen Beispiele lässt sich das verdeutlichen. So sind &myobj, &*myptr und &++myptr gültige Ausdrücke, die auch problemlos akzeptiert werden. &"Banane", &(2 * x) und &123 hingegen werden vom Compiler zurückgewiesen. Da diese (temporären) Objekte nach Ende der Anweisung verschwunden sind, wäre es nicht sehr sinnvoll ihre Adresse bestimmen zu können. Es wäre sogar gefährlich dies zuzulassen, da wir keinen Einfluss darauf haben was mit diesen Objekten nach Anweisungsende passiert. So könnte ihr Speicher bereits neu belegt sein. Aus diesem Grund wird es vom C++-Compiler unterbunden. Syntax Ähnlich wie die bereits bekannten Referenzen, im Weiteren als LValue-Referenzen bezeichnet, werden RValue-Referenzen mittels zweier & deklariert und müssen auch direkt bei der Deklaration gebunden werden.[4] 1 int&& obj = (1 + 2) ; LValue-Referenzen von RValue-Referenzen und umgekehrt (Type&&&) sind nicht erlaubt. Das lässt sich zwar mit einem typedef-konstrukt umgehen, allerdings ist das Ergebnis dabei immer ein LValue.[4] 3

4 1 typedef int& l v a l u e ; 2 typedef int&& r v a l u e ; 3 4 void dosomething ( int& i ) {} 5 void dosomething ( l v a l u e& i ) {} // C o m p i l e r f e h l e r i s t i d e n t i s c h 6 // mit dosomething ( i n t &) 7 void dosomething ( r v a l u e& i ) {} // C o m p i l e r f e h l e r i s t i d e n t i s c h 8 // mit dosomething ( i n t &) Versucht man dosomething mit diesen drei, augenscheinlich unterschiedlichen, Signaturen zu überladen, so schlägt dies fehl. Der Compiler reduziert RValue- Referenzen auf LValue-Referenzen, sowie LValue-Referenzen auf RValue-Referenzen, zu LValue-Referenzen. Dadurch haben die drei Überladungen die identische Signatur, was den Compilierungsvorgang fehlschlagen lässt. 3 Bindungsverhalten Sowohl R- als auch LValues können konstant (const) oder veränderlich (nonconst) sein. Dabei gibt es ein bestimmtes Bindungsverhalten, wobei zu beachten ist, dass konstante Objekte niemals an veränderliche Referenzen gebunden werden können. Das soll sicherstellen, dass konstante Objekte wirklich konstant sind und nicht (gewollt oder ungewollt) verändert werden können.[1] Diese Tabelle zeigt auf welche Typen(Spalten) sich an welche Referenzen(Zeilen) binden lassen: Type& const Type& Type&& const Type&& Type& Ja Nein Nein Nein const Type& Ja Ja Ja Ja Type&& Ja Nein Ja Nein const Type&& Ja Ja Ja Ja Zu beachten ist hierbei, dass eine konstante LValue-Referenz an einen (konstanten) RValue gebunden werden kann. Da der RValue dadurch einen Namen erhält, wird er zu einem LValue. 1 const int& a = ; 4

5 Es ist nicht sehr praktikabel eine Funktion mit allen vier Möglichkeiten zu überladen, da es ausreichend ist sich auf const Type& und Type&& zu beschränken, um alle Fälle abzudecken.[1] Welche Funktion bei welchem Argument aufgerufen wird, wird durch folgende zwei Regeln bestimmt: 1. Konstante Ausdrücke binden sich nur mit konstanten Referenzen 2. LValues binden sich bevorzugt mit LValue-Referenzen und RValues bevorzugt mit RValue-Referenzen. Beispiel: 1 void f u n c t i o n ( const s t r i n g& arg ) { 2 cout << LValue << endl ; 3 } 4 void f u n c t i o n ( s t r i n g&& arg ) { 5 cout << RValue << endl ; 6 } 7 8 int main ( ) { 9 s t r i n g a ( Test ) ; 10 f u n c t i o n ( a ) ; 11 f u n c t i o n ( s t r i n g ( Test ) ) ; 12 } Ausgabe: LValue RValue 5

6 4 Anwendungen 4.1 Move-Semantiken Unter move-semantiken versteht man die Möglichkeit Objekte zuweisen zu können, ohne deren Inhalt kopieren zu müssen. Anders als beim Kopieren, wird bei move keine Garantie gegeben, dass das Ursprungsobjekt unverändert bleibt. Um bei seinen Programmen eine möglichst gute Performance zu erzielen, sollten alle unnötigen Operationen vermieden werden. Doch genau das ist bei C++ schwierig und teilweise unmöglich, da die Sprache zu vielen unnötigen und zeitraubenden Kopiervorgängen zwingt. Diese Funktion soll einfach zwei Strings miteinander vertauschen:[3] 1 void swap ( s t r i n g& a, s t r i n g& b ) { 2 s t r i n g t ( a ) ; // es wird e i n e Kopie von a e r z e u g t 3 a = b ; // b wird k o p i e r t 4 b = t ; // t wird k o p i e r t 5 } Es werden also drei Kopien erzeugt, obwohl wir eigentlich keine einzige brauchen. In diesem Beispiel mag das zwar noch nicht ins Gewicht fallen, wenn jedoch statt Strings Vektoren, oder noch schlimmer Vektoren von Vektoren betrachtet werden, kann durch diese Operation viel Rechenzeit unnötig verloren gehen. Eine Möglichkeit dieses Problem zu lösen, wäre es, die Funktion swap so zu ändern, dass nur der Inhalt der beiden Objekte vertauscht wird. Allerdings wäre ein verallgemeinertes swap als Template für alle Objekte viel praktischer und eine swap-funktion für jede Klasse zu schreiben wäre viel zu viel Aufwand und würde das Problem, dass zu viel kopiert wird nur für diese eine Funktion lösen. In C++0x bieten uns RValue-Referenzen die Möglichkeit dieses Problem relativ einfach zu umgehen: Im folgenden Beispiel werden nun, statt Strings, Objekte der Klasse mystring 6

7 verwendet die später genauer beschrieben werden um einige Aspekte genauer betrachten zu können. 1 void swap ( mystring& a, mystring& b ) { 2 mystring t ( std : : move ( a ) ) ; 3 a = std : : move ( b ) ; 4 b = std : : move ( t ) ; 5 } Die Funktion move aus der Standard Template Library bewirkt an sich nicht viel und so ist auch ihre Definition recht kurz:[4] 1 template <Class T> 2 typename r e m o v e r e f e r e n c e <T>:: type&& 3 move (T&& a ) { 4 return a ; 5 } move akzeptiert einen L- oder RValue und gibt ihn als RValue zurück ohne ihn zu kopieren. Damit ermöglicht move dem Programmierer ein Objekt als RValue zu markieren und er kann somit kenntlich machen, dass er an dem weiteren Verbleib des Objektes nicht interessiert ist. So kann move unter Umständen ein zerstörender Aufruf sein. move alleine ermöglicht allerdings noch keine Move-Semantiken. Dafür muss noch die Klasse mystring angepasst werden. 1 class mystring { 2 public : 3 // Normaler Konstruktor 4 mystring ( const s t r i n g s ) { 5 cout << normal c o n s t r u c t o r << endl ; 6 content = new s t r i n g ( s ) ; 7 } 8 // Kopierender Konstruktor 9 mystring ( const mystring& other ) { 10 cout << copy c o n s t r u c t o r << endl ; 11 i f ( content ) content = new s t r i n g ( other. content ) ; 12 else content = NULL; 13 } 14 //Move Konstruktor 15 mystring ( mystring&& other ) { 16 cout << move c o n s t r u c t o r << endl ; 17 content = other. content ; // (1) 18 other. content = NULL; // (2) 19 } 7

8 20 // Kopierende Zuweisung 21 mystring& operator=(const mystring& o t h e r ) { 22 cout << copy assignment << e n d l ; 23 i f ( this!= &other ) { 24 delete content ; 25 i f ( other. content ) { 26 content = new s t r i n g ( other. content ) ; 27 } else { 28 content = NULL; 29 } 30 } 31 return this ; 32 } 33 //Move Zuweisung 34 mystring& operator=(mystring&& other ) { 35 cout << move assignment << e n d l ; 36 i f ( this!= &other ) { 37 delete content ; 38 content = other. content ; // (3) 39 other. content = NULL; // (4) 40 } 41 return this ; 42 } 43 private : 44 s t r i n g content ; 45 } ; Der normale Konstruktor, der kopierende Konstruktor und die kopierende Zuweisung funktionieren nach dem bekannten Schema. Neu sind allerdings der Move-Konstruktor und die Move-Zuweisung, die schlussendlich die Move-Semantiken ermöglichen: Der Kerngedanke dahinter ist relativ einfach:[1] Dadurch, dass ein RValue übergeben wurde, kann das Objekt manipuliert werden, ohne dass es Auswirkungen auf das restliche Programm hat, da es als temporäres Objekt nach Abschluss der Funktion gelöscht wird und nicht weiter zugreifbar ist. Diesen Umstand nutzt man um sich vom RValue Speicherplatz zu stehlen. Im Move-Konstruktor setzen wir den Pointer content auf den Pointer des anderen Objektes (1) um damit seine Daten zu übernehmen. Da nach Verlassen der Funktion das andere Objekt vernichtet wird, muss dessen Pointer auf NULL gesetzt werden (2), damit der Inhalt, den wir ja gestohlen haben, nicht auch vernichtet wird. Ähnlich funktioniert die Move-Zuweisung: Nach der Überprüfung ob es sich um dasselbe Objekt handelt, wird der Pointer des anderen Objektes übernommen 8

9 (3) und schließlich auf NULL gesetzt. Dieses Pattern lässt sich auf praktisch alle Klassen anwenden und sollte auch genutzt werden. Dadurch wird nicht nur der eigene Code beschleunigt,sondern auch Bibliotheksfunktionen, wie z.b. die der STL, profitieren davon. So soll im Zuge der Einführung von C++0x auch die STL entsprechend angepasst werden um durch Verwendung von RValue-Referenzen ihr Potential zu steigern.[6] 4.2 Das Forwarding-Problem Das Forwarding-Problem besteht darin, Argumente, die von einer äußeren Wrapper-Funktion erhalten wird, so an eine innere Funktion weiterzuleiten (engl. to forward), dass die äußere Funktion das identische Verhalten zeigt wie die innere. Im Folgenden wird gezeigt wo dabei Probleme auftreten und wie man sie in C++0x mit RValue-Referenzen lösen kann um ein perfectforwarding zu erhalten. Als Beispiel wird eine generische Factory-Funktion verwendet, die einen shared- Pointer für einen generischen Typ erstellt. In einer Anwendung könnte dies verwendet werden um die Objekterstellung im Code zentral zu halten.[3] 1 template<class T> 2 s h a r e d p t r <T> f a c t o r y ( ) { // Version ohne Argumente 3 return s h a r e d p t r <T>(new T( ) ) ; 4 } template<class T, class A> 9 s h a r e d p t r <T> f a c t o r y ( const A& arg ) { // Version mit einem Argument 10 return s h a r e d p t r <T>(new T( arg ) ) ; 11 } Offensichtlich muss die Factory-Funktion dieselben Argumente akzeptieren wie die Konstruktoren der Objekte die erzeugt werden. Der Einfachheit halber beschränkt sich das Beispiel auf maximal ein Argument. Eine Verwendung könnte so aussehen: 9

10 1 s h a r e d p t r <C> c = f a c t o r y <C>(5) ; Allerdings gibt es einen Compilerfehler, falls der Konstruktor von C ein nichtkonstantes (non-const) Argument verlangt, da sich dieses Argument nicht an das konstante Argument der Factory-Funktion binden kann. Eine einfache Möglichkeit wäre nun die Factory-Funktion umzuschreiben: 1 template<class T, class A> 2 s h a r e d p t r <T> f a c t o r y (A& arg ) { 3 return s h a r e s p t r <T>(new T( arg ) ) ; 4 } Nun arbeitet die Factory-Funktion problemlos mit konstanten und nicht-konstanten Argumenten. 1 int i = 4 2 ; 2 const int j = 2 3 ; 3 s h a r e d p t r <C> a = f a c t o r y <C>( i ) ; // f u n k t i o n i e r t 4 s h a r e d p t r <C> b = f a c t o r y <C>( j ) ; // f u n k t i o n i e r t Allerdings ergibt sich mit dieser Lösung ein neues Problem: Anders als der Konstruktor von C akzeptiert die Factory-Funktion keine RValues mehr, da sich diese nur an eine konstante LValue-Referenz binden können. 1 C c ( 1 3 ) ; // f u n k t i o n i e r t 2 s h a r e d p t r c p = f a c t o r y <C>(13) ; // C o m p i l e r f e h l e r Dieses Problem ließe sich lösen, indem die Factory-Funktion für jede Kombination von konstanten und nicht-konstanten Argumenten überladen werden würde. In unserem Beispiel mit nur einem Argument wären zwei Überladungen notwendig, was noch akzeptabel wäre. Aber bei drei Argumenten wären es bereits acht Überladungen und bei n-argumenten 2 n Überladungen. Es ist offensichtlich, dass dies keine brauchbare Lösung ist. Auch in diesem Fall bieten uns die RValue-Referenzen eine einfache Möglichkeit dieses Forwarding-Problem zu lösen: 1 template<class T, class A> 2 s h a r e d p t r <T> f a c t o r y (A&& arg ) { 3 return s h a r e d p t r <T>(new T( std : : forward<a>(arg ) ) ) ; 4 } 10

11 Wie der Name der forward-funktion aus der Standard Template Library bereits vermuten lässt, wird das Argument an den Konstruktor unverändert weitergeleitet. Dabei bleibt erhalten, ob es sich um einen R- oder LValue handelt. Die Definition von std::forward:[3] 1 template<class T> 2 struct i d e n t i t y { 3 typedef T type ; 4 } 5 template<class T> 6 T&& forward (typename i d e n t i t y <T>:: type&& a ) { 7 return a ; 8 } Dank forward wird das so genannte Perfekt-Forwarding möglich, da nun für jede Anzahl an Argumenten nur eine Überladung benötigt wird. Also für n- Argumente nur eine einzige statt 2 n, was eine sehr praktikable Lösung darstellt. 5 Compiler Zwar wird es noch einige Zeit dauern bis der neue C++0x-Standard veröffentlicht wird (voraussichtlich 2010), dennoch sind RValue-Referenzen bereits im GNU g++-compiler ab Version implementiert und verfügbar. Um sie nutzen zu können muss der C++0x-Modus mittels der Compiler-Option -std = c++0x aktiviert werden.[5] 6 Fazit Mit den RValue-Referenzen bietet C++0x eine praktikable Lösung für die Problematiken des Move-Semantiken und des Perfect-Forwardings. Im Falle der Move-Semantiken kann das die ohnehin schon gute Geschwindigkeit von C++- Programmen noch weiter steigern, da unnötige Kopieroperationen vermieden werden. Auch wenn ein Programmierer sie selber nicht verwendet, profitiert er durch die Verwendung in der STL doch auch davon. 11

12 Durch das Perfect-Forwarding wird dem Programmierer unter Umständen viel Arbeit erspart und der resultierende Code übersichtlicher und leichter wartbar. Andererseits wird C++ durch den neuen Referenztyp (type&&) und die anfangs verwirrende Unterscheidung zwischen R- und LValues noch komplexer und für Einsteiger noch schwerer zu erlernen als es ohnehin schon ist. Die Zukunft wird also zeigen müssen ob sich RValue-Referenzen durchsetzen können. 7 Quellenverzeichnis [1] Visual C++ Team Blog: RValue References: C++0x Features [2] Wikipedia: C++0x - Rvalue reference and move semantics [3] A Brief Introduction to Rvalue References [4] Rvalue - references: the basics boris/blog/2008/11/24/rvalue-reference-basics/ [5] C++0x Support in GCC [6]Impact of rvalue reference on the library

Meeting C++ C++11 R-Value Referenzen

Meeting C++ C++11 R-Value Referenzen Meeting C++ Detlef Wilkening http://www.wilkening-online.de 09.11.2012 Inhalt Motivation L-Values und R-Values R-Value Referenzen Move Semantik std::move Funktionen mit R-Value-Referenz Parametern Fazit

Mehr

Praxisorientierte Einführung in C++ Lektion: "Der C++-11 Standard"

Praxisorientierte Einführung in C++ Lektion: Der C++-11 Standard Praxisorientierte Einführung in C++ Lektion: "Der C++-11 Standard" Christof Elbrechter Neuroinformatics Group, CITEC July 5, 2012 Christof Elbrechter Praxisorientierte Einführung in C++ July 5, 2012 1

Mehr

Von der Dreierregel zur Fünferregel in C++11

Von der Dreierregel zur Fünferregel in C++11 Von der Dreierregel zur Fünferregel in C++11 Oliver Niebsch Deeply Embedded Inhaltsverzeichnis 1 Einleitung... 3 2 Die Dreierregel... 4 2.1 Objektkopien... 5 3 Die Fünferregel... 7 3.1 Move Semantik...

Mehr

Einführung in die Programmierung II. 5. Zeiger

Einführung in die Programmierung II. 5. Zeiger Einführung in die Programmierung II 5. Zeiger Thomas Huckle, Stefan Zimmer 16. 5. 2007-1- Bezüge als Objekte Bisher kennen wir als Bezüge (Lvalues) nur Variablennamen Jetzt kommt eine neue Sorte dazu,

Mehr

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

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes Verschlüsseln eines Bildes Visuelle Kryptographie Anwendung von Zufallszahlen Wir wollen ein Bild an Alice und Bob schicken, so dass Alice allein keine Information über das Bild bekommt Bob allein keine

Mehr

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

DAP2-Programmierpraktikum Einführung in C++ (Teil 2) DAP2-Programmierpraktikum Einführung in C++ (Teil 2) Carsten Gutwenger 18. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Dynamischer Speicher Klassen und

Mehr

Programmierkurs C/C++

Programmierkurs C/C++ Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Freitag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Blockkurs: "Einführung in C/C++" 2 Vererbung Klassen erben die Member von Basisklassen:

Mehr

Konstruktor/Destruktor

Konstruktor/Destruktor 1/23 Konstruktor/Destruktor Florian Adamsky, B. Sc. (PhD cand.) florian.adamsky@iem.thm.de http://florian.adamsky.it/ cbd Softwareentwicklung im WS 2014/15 2/23 Outline 1 2 3/23 Inhaltsverzeichnis 1 2

Mehr

Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer"

Praxisorientierte Einführung in C++ Lektion: Smart-Pointer Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer" Christof Elbrechter Neuroinformatics Group, CITEC June 26, 2014 Christof Elbrechter Praxisorientierte Einführung in C++ June 26, 2014 1 / 17

Mehr

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

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18 C++ Teil 5 Sven Groß 13. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 1 / 18 Themen der letzten Vorlesung Funktionen Funktionsüberladung, Signatur Rekursion const-deklaration Referenzen

Mehr

Programmieren in C++ Überladen von Methoden und Operatoren

Programmieren in C++ Überladen von Methoden und Operatoren Programmieren in C++ Überladen von Methoden und Operatoren Inhalt Überladen von Methoden Überladen von Operatoren Implizite und explizite Konvertierungsoperatoren 7-2 Überladen von Methoden Signatur einer

Mehr

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester

Mehr

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

Polymorphismus 179. Function.h. #include <string> Polymorphismus 179 #include Function.h class Function { public: virtual ~Function() {}; virtual std::string get_name() const = 0; virtual double execute(double x) const = 0; }; // class Function

Mehr

Objektorientierte Programmierung mit C++ SS 2007

Objektorientierte Programmierung mit C++ SS 2007 Objektorientierte Programmierung mit C++ SS 2007 Andreas F. Borchert Universität Ulm 5. Juni 2007 Polymorphismus #include Function.h class Function { public: virtual ~Function() {}; virtual std::string

Mehr

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

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder

Mehr

Visuelle Kryptographie. Anwendung von Zufallszahlen

Visuelle Kryptographie. Anwendung von Zufallszahlen Visuelle Kryptographie Anwendung von Zufallszahlen Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken, so dass Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken,

Mehr

Programmieren in C++ Überblick

Programmieren in C++ Überblick Programmieren in C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 6. Templates und generische Programmierung

Mehr

Methoden und Wrapperklassen

Methoden und Wrapperklassen Methoden und Wrapperklassen CoMa-Übung IV TU Berlin 06.11.2012 CoMa-Übung IV (TU Berlin) Methoden und Wrapperklassen 06.11.2012 1 / 24 Themen der Übung 1 Methoden 2 Wrapper-Klassen CoMa-Übung IV (TU Berlin)

Mehr

C++ Templates. Wozu Templates? Definition von Templates. Gebrauch von Templates. Instanziierung und Organisation

C++ Templates. Wozu Templates? Definition von Templates. Gebrauch von Templates. Instanziierung und Organisation C++ Templates Wozu Templates? Definition von Templates Gebrauch von Templates Instanziierung und Organisation Birgit Möller & Denis Williams AG Bioinformatik & Mustererkennung Institut für Informatik Martin-Luther-Universität

Mehr

Überblick. 5. Objekt und Klasse, Elementfunktionen

Überblick. 5. Objekt und Klasse, Elementfunktionen Überblick 1. Einführung C++ / Entwicklung/ Sprachfamilie 2. Nicht objektorientierte Erweiterungen von C 2.1 Das Ein-/Ausgabekonzept von C++ 2.2 Referenzen in C++ 2.3 Heap-Allokatoren in C++ 3. Grundlagen

Mehr

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

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke Institut für Programmierung und Reaktive Systeme Java 6 Markus Reschke 13.10.2014 OOP Objekte = Verhalten (durch Methoden) + Daten (durch Attribute) Klassen = Baupläne für Objekte Kapselung von Programmteilen

Mehr

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

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren Programmieren in C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 6. Templates und generische Programmierung

Mehr

Programmierung mit C Zeiger

Programmierung mit C Zeiger Programmierung mit C Zeiger Zeiger (Pointer)... ist eine Variable, die die Adresse eines Speicherbereichs enthält. Der Speicherbereich kann... kann den Wert einer Variablen enthalten oder... dynamisch

Mehr

Grundlagen der OO- Programmierung in C#

Grundlagen der OO- Programmierung in C# Grundlagen der OO- Programmierung in C# Technische Grundlagen 1 Dr. Beatrice Amrhein Überblick Visual Studio: Editor und Debugging Die Datentypen Methoden in C# Die Speicherverwaltung 2 Visual Studio 3

Mehr

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

C++ Notnagel. Ziel, Inhalt. Programmieren in C++ C++ Notnagel Ziel, Inhalt Ich versuche in diesem Dokument noch einmal die Dinge zu erwähnen, die mir als absolut notwendig für den C++ Unterricht und die Prüfungen erscheinen. C++ Notnagel 1 Ziel, Inhalt

Mehr

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only Methoden Wie Konstruktoren und Destruktoren zum Auf- und Abbau von Objekten definiert werden, Wie inline-methoden Methoden,, Zugriffsmethoden und Read-Only Only- Methoden einzusetzen sind, Der this-pointer

Mehr

7. Übung Informatik II - Objektorientierte Programmierung

7. Übung Informatik II - Objektorientierte Programmierung 7. Übung Informatik II - Objektorientierte Programmierung 29. Mai 2015 Inhalt 1 2 3 Übersicht 1 2 3 Idee Menschen nehmen die Welt in Form von Objekten wahr manche Objekte haben gleiche Eigenschaften, hierüber

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 27 Einstieg in die Informatik mit Java Klassen als Datenstrukturen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 27 1 Überblick: Klassen als Datenstruktur 2 Vereinbarung

Mehr

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14 C++ Teil 6 Sven Groß 27. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 27. Mai 2016 1 / 14 Themen der letzten Vorlesung Musterlösung A2 Wdh.: Zeiger und Felder Kopieren von Feldern Dynamische Speicherverwaltung

Mehr

8. Referenzen und Zeiger

8. Referenzen und Zeiger 8. Referenzen und Zeiger Motivation Variable werden in C++ an speziellen Positionen im Speicher abgelegt. An jeder Position befindet sich 1 Byte. Sie sind durchnummeriert beginnend bei 0. Diese Positionen

Mehr

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache:

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache: Kapitel 8 Operatoren Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache: Operatoren definieren Es ist in C++ möglich, Operatoren wie +, oder für

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 34 Einstieg in die Informatik mit Java Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 34 1 Definition von Klassen 2 Methoden 3 Methoden

Mehr

1. Übung zu "Numerik partieller Differentialgleichungen"

1. Übung zu Numerik partieller Differentialgleichungen 1. Übung zu "Numerik partieller Differentialgleichungen" Simon Gawlok, Eva Treiber Engineering Mathematics and Computing Lab 22. Oktober 2014 1 / 15 1 Organisatorisches 2 3 4 2 / 15 Organisatorisches Ort:

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 22 Einstieg in die Informatik mit Java Generics Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 22 1 Überblick Generics 2 Generische Klassen 3 Generische Methoden 4

Mehr

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen 5 Objektorientierte Programmierung in Java Prof. Dr. Ing. André Stuhlsatz Referenzen Beispiel an der einfachen Klasse Walze: public class Walze { int id; public Walze(int id) { this.id = id; Verwenden

Mehr

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

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16 C++ Teil 5 Sven Groß IGPM, RWTH Aachen 8. Mai 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai 2015 1 / 16 Themen der letzten Vorlesung Live Programming zu A2 Gleitkommazahlen Rundungsfehler Auswirkung

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 25 Einstieg in die Informatik mit Java Objektorientierte Programmierung und Klassen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 25 1 Die Philosophie 2 Definition

Mehr

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse Überblick 1. Einführung C++ / Entwicklung/ Sprachfamilie 2. Nicht objektorientierte Erweiterungen von C 2.1 Das Ein-/Ausgabekonzept von C++ 2.2 Referenzen in C++ 2.3 Heap-Allokatoren in C++ 3. Grundlagen

Mehr

Programmieren - C++ Templates

Programmieren - C++ Templates Programmieren - C++ Templates Reiner Nitsch r.nitsch@fbi.h-da.de Was sind Templates? C++ Templates ermöglichen generische Programmierung. Das ist Programmierung unabhängig vom speziellen Objekt-Typ Templates

Mehr

Konzepte der Programmiersprachen

Konzepte der Programmiersprachen Konzepte der Programmiersprachen Sommersemester 2010 4. Übungsblatt Besprechung am 9. Juli 2010 http://www.iste.uni-stuttgart.de/ps/lehre/ss2010/v_konzepte/ Aufgabe 4.1: Klassen in C ++ Das folgende C

Mehr

6 ZEIGER UND REFERENZEN - ALLGEMEINES

6 ZEIGER UND REFERENZEN - ALLGEMEINES 6 ZEIGER UND REFERENZEN - ALLGEMEINES Leitideen: Zeiger sind Adressen mit zusätzlicher Typinformation über das dort gespeicherte Objekt. Die Vereinbarungssyntax soll der Ausdruckssyntax entsprechen und

Mehr

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

Praxisorientierte Einführung in C++ Lektion: Das Schlüsselwort explicit Praxisorientierte Einführung in C++ Lektion: "Das Schlüsselwort explicit" Christof Elbrechter Neuroinformatics Group, CITEC April 24, 2014 Christof Elbrechter Praxisorientierte Einführung in C++ April

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine

Mehr

Programmierkurs C/C++

Programmierkurs C/C++ Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Donnerstag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Structs Blockkurs: "Einführung in C/C++" 2 Structs sind Bündel von Variablen (unter

Mehr

Klassen. Kapitel Klassendeklaration

Klassen. Kapitel Klassendeklaration Kapitel 4 Klassen Wir kommen nun zu einem sehr wichtigen Aspekt der OOT: zu den Klassen. Eine Klasse ist eine vom Benutzer definierte Datenstruktur, eine Sammlung von Variablen (unterschiedlichen Typs)

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 17 Einstieg in die Informatik mit Java Methoden und Felder Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 17 1 Überblick 2 Felder als Parameter bei Methoden 3 Feld

Mehr

C Seminar. Dr.sc.nat. Michael J.M. Wagner, New Elements. Revision 89

C Seminar. Dr.sc.nat. Michael J.M. Wagner, New Elements. Revision 89 C++11 - Seminar Dr.sc.nat. Michael J.M. Wagner, New Elements Revision 89 Inhaltsverzeichnis 1 Tour de C++ 11 1 1.1 Standards und Ziele................................ 1 1.2 Kernsprache....................................

Mehr

Vererbung und Polymorphie

Vererbung und Polymorphie page1 Vererbung und Polymorphie Florian Adamsky, B Sc florianadamsky@iemthmde http://florianadamskyit/ cbd So wareentwicklung im SS 2014 page2 Outline 1 Ein ührung 2 Vererbung Formen der Vererbung 3 Polymorphie

Mehr

Java I Vorlesung 6 Referenz-Datentypen

Java I Vorlesung 6 Referenz-Datentypen Java I Vorlesung 6 Referenz-Datentypen 7.6.2004 Referenzen this, super und null Typkonvertierung von Referenztypen Finale Methoden und Klassen Datentypen in Java In Java gibt es zwei Arten von Datentypen:

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen Themen der Übung 1 Organisatorisches Methoden und Wrapperklassen 2 Methoden 3 Wrapper-Klassen CoMa-Übung IV TU Berlin 07.11.2012 Organisatorisches: Im Pool nur auf die Abgabeliste setzen, wenn ihr wirklich

Mehr

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

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17 C++ Teil 9 Sven Groß 17. Juni 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 9 17. Juni 2016 1 / 17 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente Methoden / Elementfunktionen

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Funktionen Rückblick Operatoren logische Verknüpfungen Zusammengesetzte Operatoren ( Zuweisungsoperatoren ) Kontrollstrukturen Bedingte Anweisungen (if-abfrage, switch-konstrukt)

Mehr

Objektorientierte Programmierung und Klassen

Objektorientierte Programmierung und Klassen Objektorientierte Programmierung und Klassen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 16.5.07 G. Bohlender (IANM UNI Karlsruhe) OOP

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

Lösung der OOP-Prüfung WS12/13

Lösung der OOP-Prüfung WS12/13 2.1.2013 Lösung der OOP-Prüfung WS12/13 1. Aufgabe a) Da der Konstruktor im protected-bereich steht, können keine eigenständigen Objekte der Klasse angelegt werden. Durch den protected-konstruktor wird

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

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

Programmierkurs C++ Templates & STL (1/2) Programmierkurs C++ Templates & STL (1/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer #2 Templates Die wichtigsten objekt-orientierten

Mehr

Wichtige Prinzipien von C#

Wichtige Prinzipien von C# Wichtige Prinzipien von C# Marc Satkowski 20. November 2016 C# Kurs Gliederung 1. Dokumentationskommentare 2. Gültigkeit (Scope) 3. namespace & using 4. Methodenüberladung 5. Wert- & Referenztyp 6. null

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 03 Vererbung, Polymorphie, Sichtbarkeit, Interfaces Clemens Lang T2 11. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/26 Klassen und Objekte Klassen und Objekte

Mehr

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen C-Pointer (Zeiger, Adressen) vs. C++ Referenzen Der Pointer (C/C++): In C/C++ ist der Pointer ein eigener Datentyp, der auf Variablen/Objekte zeigen kann. Indem man den Pointer dereferenziert, gewinnt

Mehr

Verkettete Datenstrukturen: Listen

Verkettete Datenstrukturen: Listen Verkettete Datenstrukturen: Listen 2 Listen Formal: Liste = endliche Folge von Elementen [a 1, a 2,..., a n ]. Spezialfall: leere Liste [ ]. Länge einer Liste = Anzahl der Elemente (bei leerer Liste: 0).

Mehr

Pods und Objects (Klassen)

Pods und Objects (Klassen) Pods und Objects (Klassen) Grundbegriffe: Pods = Plain Old Data: Es handelt sich dabei hauptsächlich um die schon in C eingebauten Datentypen wie Ganzzahltypen: char, short, int, long, long long (auch

Mehr

pue13 January 28, 2017

pue13 January 28, 2017 pue13 January 28, 2017 1 Aufgabe 1 (Klammern und Anweisungsblöcke) Wie Sie in der Vorlesung gelernt haben, werden Anweisungsblöcke in Java nicht durch Einrückung, sondern mithilfe von geschweiften Klammern

Mehr

Dynamische Datentypen

Dynamische Datentypen Dynamische Datentypen Tupel und Folgen o Wertebereich eines Structs / einer Klasse: T1 T2... Tk Werte sind k-tupel Tupel und Folgen o Wertebereich eines Structs / einer Klasse: T1 T2... Tk Werte sind k-tupel

Mehr

Informatik II Übung 05. Benjamin Hepp 3 April 2017

Informatik II Übung 05. Benjamin Hepp 3 April 2017 Informatik II Übung 05 Benjamin Hepp benjamin.hepp@inf.ethz.ch 3 April 2017 Java package Hierarchie import.. nur noetig um Klassen aus anderen Packeten zu importieren Es kann auch immer der vollstaendige

Mehr

Überladen von Operatoren

Überladen von Operatoren - Überladen des Indexoperators [] - Überladen des Ausgabeoperators > Programmieren in C++ Informatik FH Trier C++12-1 ähnlich dem Überladen von Funktionen Überladen

Mehr

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. ) Technische Informatik für Ingenieure (TIfI) WS 2006/2007, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Rekursion Datenstrukturen Merge S ( split, s, merge ) Beispiel:

Mehr

Java I Vorlesung Generics und Packages

Java I Vorlesung Generics und Packages Java I Vorlesung 9 Generics und Packages 21.6.2004 Generics Packages Qualifizierte Namen Mehr zu Zugriffsklassen Generics (Java 1.5) Die Klassen im Java Collections Framework sind mit dem Typ ihrer Elemente

Mehr

Vorlesung Objektorientierte Programmierung Klausur

Vorlesung Objektorientierte Programmierung Klausur Prof. Dr. Stefan Brass 16. Februar 2007 Dipl.-Inform. Annett Thüring Institut für Informatik MLU Halle-Wittenberg Vorlesung Objektorientierte Programmierung Klausur Name: Matrikelnummer: Studiengang: Aufgabe

Mehr

1 Polymorphie (Vielgestaltigkeit)

1 Polymorphie (Vielgestaltigkeit) 1 Polymorphie (Vielgestaltigkeit) Problem: Unsere Datenstrukturen List, Stack und Queue können einzig und allein int-werte aufnehmen. Wollen wir String-Objekte, andere Arten von Zahlen oder andere Objekttypen

Mehr

Programmieren - C++ Funktions-Templates

Programmieren - C++ Funktions-Templates Programmieren - C++ Funktions-Templates Reiner Nitsch 8471 r.nitsch@fbi.h-da.de Was sind Templates? C++ Templates ermöglichen generische Programmierung. Das ist Programmierung unabhängig vom speziellen

Mehr

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm Exkurs: ANONYME KLASSEN Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm Anonyme Klassen Eigenschaften 1 Häufigste Anwendung lokaler Klassen: anonyme Definition. Klasse erhält keinen eigenen

Mehr

Praxisorientierte Einführung in C++ Lektion: "Klassen Templates"

Praxisorientierte Einführung in C++ Lektion: Klassen Templates Praxisorientierte Einführung in C++ Lektion: "Klassen Templates" Christof Elbrechter Neuroinformatics Group, CITEC April 12, 2012 Christof Elbrechter Praxisorientierte Einführung in C++ April 12, 2012

Mehr

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl Funktionen Zusammenfassung von Befehlssequenzen als aufrufbare/wiederverwendbare Funktionen in einem Programmblock mit festgelegter Schnittstelle (Signatur) Derartige prozedurale Programmierung erlaubt

Mehr

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

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren Themen Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren Statische Methoden Klassenmethoden Merkmal der Klasse nicht eines einzelnen Objekts

Mehr

3. Exkurs in weitere Arten der Programmierung

3. Exkurs in weitere Arten der Programmierung 3. Exkurs in weitere Arten der Programmierung Inhalt: Objektorientierte Programmierung in C++ Logische Programmierung in Prolog Peter Sobe Objektorientierte Programmierung in C++ C++ ist eine objektorientierte

Mehr

Wie teuer ist dynamischer Polymorphismus? 194

Wie teuer ist dynamischer Polymorphismus? 194 Wie teuer ist dynamischer Polymorphismus? 194 Function f vtable data RTTI ~Function get_name type name type info "Sinus\0" execute Nicht-polymorphe Methoden und reguläre Funktionen können in C++ direkt

Mehr

7.0 Arbeiten mit Objekten und Klassen

7.0 Arbeiten mit Objekten und Klassen 252-0027 Einführung in die Programmierung I 7.0 Arbeiten mit Objekten und Klassen Thomas R. Gross Department Informatik ETH Zürich Copyright (c) Pearson 2013. and Thomas Gross 2016 All rights reserved.

Mehr

Vorlesung Programmieren

Vorlesung Programmieren Vorlesung Programmieren Speicherverwaltung und Parameterübergabe Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Gültigkeitsbereich von

Mehr

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

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Test-Besprechung! Ziele verdeutlichen Große Bild von OOP Wiederholung: Einbettung als Technik

Mehr

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind Templates und Containerklassen Ziel, Inhalt Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind Templates und Containerklassen 1 Ziel, Inhalt

Mehr

18. Vererbung und Polymorphie

18. Vererbung und Polymorphie 590 18. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume 591 -(3-(4-5))*(3+4*5)/6

Mehr

Einführung zu den Klassen in C++ 107

Einführung zu den Klassen in C++ 107 Einführung zu den Klassen in C++ 107 class Counter { public: // constructors Counter() : counter{0 { Counter(int counter) : counter{counter { // accessors int get() const { return counter; // mutators

Mehr

11 Vererbung und Klassenhierarchie

11 Vererbung und Klassenhierarchie 11 Vererbung und Klassenhierarchie Bestandteile objektorientierter Programmierung: Bestehende Klassen können durch Spezialisierung und Erweiterung weiterentwickelt werden, ohne den Programmcode der alten

Mehr

Hydroinformatik I: Klassen

Hydroinformatik I: Klassen Hydroinformatik I: Klassen Prof. Dr.-Ing. habil. Olaf Kolditz 1 Helmholtz Centre for Environmental Research UFZ, Leipzig 2 Technische Universität Dresden TUD, Dresden Dresden, 27. November 2015 1/13 Prof.

Mehr

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung: Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Der Sourcecode wird an den entsprechenden Stellen im Programm wiederholt Programm wird lang

Mehr

Modernes C++ (C++11)

Modernes C++ (C++11) Modernes C++ (C++11) Dr. Klaus Ahrens C++ History 3 C++ History ~ 1980 Bjarne Stroustrup C with Classes Cfront (C++ --> C) 1983 erstmalige Nennung von C++ 1990 Annotated Reference Manual 1994 erster Entwurf

Mehr

Klassen als Datenstrukturen

Klassen als Datenstrukturen Einstieg in die Informatik mit Java, Vorlesung vom 27.11.07 Übersicht 1 Klassen als Datenstruktur 2 Vereinbarung von Klassen 3 Erzeugen von Objekten - Instanzen einer Klasse 4 Zugriff auf Attribute 5 Initialisierung

Mehr

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur Unterprogramme Unterprogramme sind abgekapselte Programmfragmente, welche es erlauben, bestimmte Aufgaben in wiederverwendbarer Art umzusetzen. Man unterscheidet zwischen Unterprogrammen mit Rückgabewert

Mehr

ADT: Verkettete Listen

ADT: Verkettete Listen ADT: Verkettete Listen Abstrakter typ - Definition public class Bruch int zaehler, nenner; public Bruch(int zaehler, int nenner) this.zaehler = zaehler; this.nenner = nenner; Konstruktor zum Initialisieren

Mehr

Bei for-schleifen muss man nur immer bedenken, dass die letzte Anweisung immer erst nach der Ausführung der restlichen Anweisungen der Schleife

Bei for-schleifen muss man nur immer bedenken, dass die letzte Anweisung immer erst nach der Ausführung der restlichen Anweisungen der Schleife 303 Bei for-schleifen muss man nur immer bedenken, dass die letzte Anweisung immer erst nach der Ausführung der restlichen Anweisungen der Schleife durchgeführt wird. 304 305 for-schleifen sind in Aktivitätsdiagrammen

Mehr

Zeiger in C und C++ Zeiger in Java und C/C++

Zeiger in C und C++ Zeiger in Java und C/C++ 1 Zeiger in Java und C/C++ Zeigervariable (kurz: Zeiger, engl.: pointer): eine Variable, die als Wert eine Speicheradresse enthält Java: Zeiger werden implizit für Referenztypen (Klassen und Arrays) verwendet,

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 35 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 35 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren

Mehr

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom Einstieg in die Informatik mit Java, Vorlesung vom 2.5.07 Übersicht 1 2 definition 3 Parameterübergabe, aufruf 4 Referenztypen bei 5 Überladen von 6 Hauptprogrammparameter 7 Rekursion bilden das Analogon

Mehr

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, 13.00-14.45 Uhr Bearbeitungszeit: 105 Minuten Schalten Sie ihr Mobiltelefon aus. Bei der Klausur ist als einziges

Mehr

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele Überblick 1. Einführung C++ / Entwicklung/ Sprachfamilie 2. Nicht objektorientierte Erweiterungen von C 2.1 Das Ein-/Ausgabekonzept von C++ 2.2 Referenzen in C++ 2.3 Heap-Allokatoren in C++ 3. Grundlagen

Mehr

Hydroinformatik I: Klassen

Hydroinformatik I: Klassen Hydroinformatik I: Klassen Prof. Dr.-Ing. habil. Olaf Kolditz 1 Helmholtz Centre for Environmental Research UFZ, Leipzig 2 Technische Universität Dresden TUD, Dresden Dresden, 11. November 2016 1/20 Prof.

Mehr

Programmierkurs C++ Kapitel 6 Module Seite 1

Programmierkurs C++ Kapitel 6 Module Seite 1 Programmierkurs C++ Kapitel 6 Module Seite 1 (Quell-)Module Unter einem Modul versteht man einen Teil des Programms, der eigenständig übersetzt werden kann. In der Syntax der Programmiersprachen werden

Mehr