Pods und Objects (class und struct)
|
|
|
- Herbert Linden
- vor 8 Jahren
- Abrufe
Transkript
1 Grundbegriffe: Pods und Objects (class und struct) Pod = Plain Old Data: Es handelt sich dabei hauptsächlich um die schon in C eingebauten Datentypen wie z.b. Ganzzahltypen: char, short, int, long, long long (auch unsigned) Gleitkommatypen: float, double, long double bool alle Pointer C-Arrays von solchen Typen struct und class-typen, die nur Pod-Attribute enthalten und weder Konstruktoren, Destruktor oder Zuweisungsoperatoren haben Definiert man Variablen (Instanzen) von diesem Typ, erfolgt kein automatischer Aufruf einer Funktion. Lokale Pod-Variablen werden nicht implizit initialisiert (d.h. sie haben nach der Definition einen zufälligen Wert, sofern sie nicht explizit initialisiert werden) : int x; int y = 1; // x hat hier einen undefinierten Startwert // y wird hier explizit auf 1 initialisiert Werden Pods gelöscht (z.b. lokale Variablen beim Verlassen dieser Funktion), erfolgt ebenfalls kein automatischer Aufruf einer Funktion. Objekttypen = Mittels class oder struct definierte Datentypen, die sowohl Daten- Attribute als auch Funktionen (= Methoden) haben können. Ein Objekt ist kein Pod, wenn wenigstens ein Datenattribut kein Pod ist oder aber ein Konstruktor, Destruktor oder Zuweisungsoperator definiert ist. Definiert man Variablen von diesem Typ (man "instanziert" die Objekttypen), werden IMMER spezielle Funktionen aufgerufen (die Konstruktoren, constructors, oft kurz ctor genannt). Werden solche Variablen vernichtet, werden ebenfalls IMMER Funktionen aufgerufen (Destruktor, destructor oft kurz dtor genannt). Klasse und Struktur (class and struct) Implementiert man in C++ einen etwas komplexeren Datentyp, wählt man dafür zumeist eine Klasse (class), seltener eine Struktur (struct). Beide Varianten unterscheiden sich nur in der Voreinstellung der Zugriffsrechte (class: private, struct: public) class MyClass { // die Bestandteile der Klasse, default private:
2 }; // der Strichpunkt ist Wichtig!!!! struct MyStruct { // die Bestandteile der Struktur, default public: }; // der Strichpunkt ist Wichtig!!!! Bestandteile der Objekttypen können sein (nicht vollständig): Datenobjekte, sog. Attribute: z.b. int x, y; Es spielt keine Rolle, wie komplex die Attribute sind. Auch Instanzen anderer Klassen oder Arrays davon sind selbstverständlich möglich. Funktionsdeklarationen (= Klassenfunktionen = Methoden), z.b. int func1(int); // mit Strichpunkt am Ende inline-funktionsdefinitionen: d.h. inclusive Code der Methode int func1(int a) { return a+1; } // kein Strichpunkt am Ende nach } friend-funktionsdeklarationen: z.b. friend double f(double); friend-funktionsdefinitionen: definiert auch den Code dieser Funktion friend double f(double x) {...; return...} friend-klassen: z.b. friend class AnotherClass; (macht alle Methoden von AnotherClass zu friend-funktionen). Typdeklarationen mittels typedef oder using (diese gelten dann nur innerhalb dieser Objekttypen) Auf die Bestandteile des Objekts wird wie bei C-Strukturen zugegriffen: MyClass c; c.x = 1; c.func1(5); // Eine Objekt-Instanz // das Objekt c hat das Attribut x // das Objekt c hat die Methode func1(), // diese wird mit Argument 5 aufgerufen Zusätzlich kann/soll man noch den Zugriffsschutz der Objekt-Bestandteile explizit definieren. Alles nach public: in der Objektdefinition darf im gesamten Programm verwendet werden. Alles nach private: darf nur in den Objektmethoden und in friend-funktionen verwendet werden. Alles nach protected: darf nur in den Objektmethoden, in friend-funktionen und zusätzlich auch in Methoden der abgeleiteten Objekte verwendet werden (Vererbung!). Diese 3 Labels können in beliebiger Reihenfolge
3 und Anzahl in der Objektdefinition aufscheinen. Normalerweise verwendet man aber jedes Label höchstens einmal. Die oft empfohlene Reihenfolge ist public: vor protected: (dieses fehlt zumeist ganz) und private: Der Konstruktor, constructor, ctor: Konstruktoren sind Methoden, die gleich wie der Objekttyp heißen. Eine Klasse kann beliebig viele Konstruktoren besitzen, wenn diese sich in der Argumentliste unterscheiden (Überladen von Funktionen). Konstruktoren haben KEINEN Rückgabetyp (kein void!!!). Ein Konstruktor, der ohne Argumente aufrufbar ist, heißt "Standardkonstruktor" oder "default constructor". Er hat keine Argumente oder alle seine Argumente besitzen Defaultwerte. Konstruktoren werden eigentlich NIE explizit aufgerufen, ihr Aufruf erfolgt bei jeder Instanzierung von Objekten (= man definiert Variablen von diesem Objekttyp). Bei jeder Definition einer Objektinstanz wird ein Konstruktor aufgerufen, es handelt sich daher IMMER um ausführbaren Code. Es gibt mehrere zulässige Schreibweisen: Komplexe_Zahl z; Komplexe_Zahl z{}; -> Komplexe_Zahl() (= Default-K.) Komplexe_Zahl z(1.) Komplexe_Zahl z = 1. Komplexe_Zahl z{1.} Komplexe_Zahl z = {1.} -> Komplexe_Zahl(1.) Komplexe_Zahl z(1., 2.0) Komplexe_Zahl z{1., 2.} Komplexe_Zahl z = {1., 2.} -> Komplexe_Zahl(1., 2.) Komplexe_Zahl z{1., 2., 3.} -> Komplexe_Zahl(1., 2., 3.) 1) Auch Konstruktoren können public oder private oder protected sein. 2) Alle benötigten (= verwendeten) Konstruktoren müssen für das Objekt auch definiert sein, sonst is das ein Fehler. 3) Die von C++ empfohlene Aufrufart von Konstruktoren ist seit C++11 jene mit {}, die aber inkompatibel zu älteren Compilern ist. Bei STL-Containern ist der Aufruf mittels ( ) verschieden vom Aufruf mit { }. 4) Bei allen Konstruktoren (aber nur bei diesen) sind Initialisierungslisten für die Objektattribute zulässig und empfohlen. Mit diesen kann man Konstruktor-Aufrufe für die Attribute festlegen. Die Reihenfolge muss der Objektdefinition entsprechen.
4 Ein hier fehlendes Attribut (das selbst Objekt ist) wird mit seinem default constructor initialisiert. Ist in einem Objekttyp (class oder struct ist egal, aber es darf kein Pod sein!) kein Konstruktor definiert und es wird ein default constructor benötigt, fügt C++ zur Klasse einen trivialen public default constructor hinzu, dessen Code nur aus {} besteht. Schreibt man selbst einen Konstruktor für das Objekt, fügt C++ diesen Default Konstruktor nicht mehr automatisch dazu. Man kann diesen (wenn man will) selbst schreiben oder C++ auffordern, ihn trotzdem zu erzeugen: Komplexe_Zahl() = default; // Bitte liebes C++, generiere diesen D.K. Ein sinnvollerdefault- Konstruktor für komplexe Zahlen, der alle Fälle abdeckt, wäre Komplexe_Zahl(double x = 0., double y = 0.) : re{x}, im{y} // Initialisierungs-Liste, Konstruiere re aus x, im aus y {} // nichts mehr zu tun Komplexe_Zahl z; // z = 0 + 0*i Komplexe_Zahl z{1.}; // z = *i Komplexe_Zahl z{1., 2.} // z = *i Beachte, dass nach der Definition dieses neuen Konstruktors obige Objektdefinitionen immer Konstruktoraufrufe sind und nicht mehr Initialisierungen der struct-attribute. Der Kopier-Konstruktor (copy constructor) Der Kopierkonstruktor ist ein Konstruktor, der ein Objekt als Kopie eines anderen Objekts vom gleichen Typ initialisiert. Es gibt im Wesentlichen nur folgende erlaubte Signaturen: Komplexe_Zahl(const Komplexe_Zahl& original) // Übergabe per konstanter Referenz Komplexe_Zahl(Komplexe_Zahl& original) // Übergabe per Referenz Besitzt eine Klasse keinen Kopierkonstruktor und es wird einer benötigt, fügt C++ einen einfachen public: Kopierkonstruktor hinzu, der alle Teile des Originals kopiert (d.h. deren Kopierkonstruktoren aufruft). Eine (hier unnötige) Implementierung wäre: Komplexe_Zahl(const Komplexe_Zahl& original) : re{original.re}, im{original.im} {}
5 Aufrufe des Kopierkonstruktors: Komplexe_Zahl original{1., 2.}; Komplexe_Zahl z1(original); Komplexe_Zahl z2{original}; Komplexe_Zahl z3 = original; Komplexe_Zahl z3 = {original}; // definiere das original // prä-c++11 // C++11 // das ist keine Zuweisung!!!! // C++11 Der Zuweisungsoperator, copy-assignment operator (operator=) Der Zuweisungsoperator wird verwendet, um einer Instanz den Inhalt einer anderen zuzuweisen. Ein =-Zeichen in einer Definition ist KEINE Zuweisung sondern eine alternative Schreibweise für einen Konstruktor. Es gibt 2 erlaubte Signaturen (rhs steht für "right hand side"): Komplexe_Zahl& operator=(const Komplexe_Zahl& rhs) // Übergabe von rhs per konstanter Referenz Komplexe_Zahl& operator=(komplexe_zahl rhs) // Übergabe von rhs per Wert Da die Zuweisung bei Pods in C/C++ immer den zugewiesenen Wert als Ergebnis des Operators hat, ist das auch bei diesem Objekt-Zuweisungsoperator beizubehalten, d.h. der Rückgabewert ist eine Referenz auf das Referenzobjekt. Damit wäre eine sinnvolle (aber unnötige s.u.) vollständige Implementierung: Komplexe_Zahl& operator=(const Komplexe_Zahl& rhs) { re = rhs.re; im = rhs.im; // kopiere die Attibute return *this; // gib Referenz zurück } Komplexe_Zahl a, b, c; a = b = c = Complex{0, 1}; // setze alle 3 auf i Falls man einen Zuweisungsoperator schreibt, MUSS dieser auch bei Zuweisungen an sich selbst funktionieren, d.h. ein Statement wie z = z; darf nicht zu einem Fehler führen. Complex z1 = 5, z2 = z1; // entspricht z1{5}, z2{z1} KEINE Zuweisung z1 = z2; // Zuweisungsoperator Besitzt eine Klasse keinen Zuweisungsoperator und es wird einer benötigt, fügt C++ einen einfachen public: Zuweisungsoperator hinzu, der alle Teile des Originals an jene des Ziels zuweist.
6 Seit C++11 heißt dieser Zuweisungsoperator übrigens copy assignment operator, da es ab dann auch einen move assignment operator gibt/geben kann. Der Destruktor, destructor, dtor Er hat immer den Namen ~Objekttypname(), es darf nirgends void stehen. Deshalb kann es auch nur einen einzigen Destruktor pro Objekttyp geben. Er wird fast NIE explizit aufgerufen sondern wird von C++ vollautomatisch aufgerufen, falls eine Instanz vernichtet wird (lokale Objekte beim Ende des Blocks in { }, globale Objekte am Programmende nach main()). Sehr häufig macht man sich diese Automatik-Funktion zunutze, um automagisch Funktionen ohne expliziten Aufruf einzusetzen (z.b. std::lock_guard sperrt das Schloss auf, std::unique_ptr zerstört seinen Inhalt, std::fstream schließt sich vollautomatisch). Besitzt eine Klasse keinen Destruktor und es wird einer benötigt, fügt C++ einen einfachen public: Destruktor hinzu, der nur aus {} besteht. Der move constructor (C++11) Seit C++11 kann ein Objekttyp auch einen solchen Konstruktor besitzen, der eine Instanz als Kopie eines temporären Originals erstellt und dabei dessen Ressourcen "klaut", wann immer das möglich ist. Alle STL-Containerklassen besitzen einen solchen Konstruktor, ebenso die std::string Klasse. Dieser Konstruktor ist nur dann wirklich sinnvoll, wenn die Klassen über dynamische Inhalte verfügen, die vom Original zum Ziel verschoben werden können (deshalb: move). Obwohl das bei der Klasse Komplexe_Zahl nicht zutrifft, könnte man ihn trotzdem definieren: Komplexe_Zahl(Komplexe_Zahl&& temp) : re{temp.re}, im{temp.im} {} // Übergabe per rvalue-referenz Komplexe_Zahl z1{1, 2}; Komplexe_Zahl z2{sin(z1)}; // sin(z1) ist eine temporäre Komplexe_Zahl -Instanz Besitzt eine Klasse keinen move-constructor und es könnte einer eingesetzt werden, so fügt C++ unter bestimmten Voraussetzungen einen einfachen public: move constructor hinzu.
7 Der move assignment operator (C++11) Dieser Zuweisungsoperator wird verwendet, um einer Instanz den Inhalt einer temporären anderen zuzuweisen und dabei deren Ressourcen zu "klauen". Obwohl er für die Klasse Komplexe_Zahl keine Vorteile bietet, könnte man ihn wie folgt programmieren: Komplexe_Zahl& operator=(komplexe_zahl&& temp) { re = temp.re; im = temp.im; // kopiere die Attibute (keine Init-Liste!) return *this; // gib Referenz zurück } Komplexe_Zahl z1{1,2}, z2; z2 = sin(z1); // die rechte Seite ist ein temporary (rvalue) Besitzt eine Klasse keinen move assignment operator und es könnte einer eingesetzt werden, so fügt C++ unter bestimmten Voraussetzungen einen einfachen public: move assignment operator hinzu. Die Übergabe des Referenzobjekts Bei jedem expliziten oder impliziten Methodenaufruf gibt es eine Referenzinstanz: Komplexe_Zahl z{1}; // implizit: Aufruf von z.complex(1), z ist die Referenzinstanz z.abs(); // explizit: z die Referenzinstanz Die Referenzinstanz taucht nie in der Argumentliste der Methoden auf und wird auch NIE deklariert. Innerhalb jeder nichtstatischen Klassenmethode (nicht aber in friend- Funktionen) gibt es den Pointer this,der auf die Referenzinstanz zeigt. In den meisten Fällen darf man bei Zugriffen auf die Attribute oder Methoden des Referenzobjekts das this-> weglassen. Bei den komplexen Zahlen steht z.b. im Konstruktor einfach Komplexe_Zahl(double r = 0, double i = 0): re{r}, im{i} {} statt: Komplexe_Zahl(double r = 0, double i = 0) : this->re{r}, this->im{i} {}
8 const, aber richtig Es ist guter Stil in C++ (und manchmal auch Pflicht), alle Argumente, die per Pointer oder Referenz übergeben werden und die innerhalb einer Funktion nicht verändert werden (auch nicht auf dem Umweg über weitere Funktionen!) mit dem Zusatz const zu versehen. Wird die Referenzinstanz durch eine Methode nicht verändert, so nennt man diese eine konstante Methode und man schreibt das const nach die schließende Klammer ) vor dem ; oder { void print() const; // gib die komplexe Zahl (die Referenzinstanz) aus, diese bleibt dabei unverändert. C++ beachtet diese Zusätze genauestens. Unterscheidet sich die Funktionsdefinition auch nur in einem const-zusatz, ist es eine andere Funktion: void print() {} // eine andere Print-Funktion oder Methode Man kann Klassenattribute mit dem Schlüsselwort mutable kennzeichnen. Dann zählt eine Veränderung dieser Attribute nicht als Veränderung der Klasseninstanz und ist somit auch in konstanten Methoden erlaubt. Destruktoren, Konstruktoren und Initialisierungslisten, Typ-Umwandlung Jeder Konstruktor und Destruktor (auch wenn der Code nur{} ist) führt vollautomatisch weitere Dinge aus: Konstruktor: VOR dem eigenen Code (also vor den Statements zwischen { und }) ruft der Konstruktor für alle Basis-Objekttypen, von denen geerbt wurde, und für alle Attribute der Klasse, die selbst Objekte (keine Pods) sind, deren Standardkonstruktor auf, falls keine Initialisierungsliste vorhanden ist. Falls diese Teile selbst wieder Attribute besitzen, werden auch diese konstruiert usw. Gibt es eine Initialisierungsliste, wird anstelle des Standardkonstruktors der dort angegebene Konstruktor aufgerufen. Fehlen Attribute in der Initialisierungsliste, die selbst Objekte sind, so werden diese mit deren Default-Konstruktor erzeugt. Fehlen Attribute in der Initialisierungsliste, die Pods sind, so werden diese nicht initialisiert. Man kann diese jedoch alternativ mittels Zuweisungen im Programmteil des Konstruktors auf vernünftige Anfangswerte setzen. Destruktor: Nach dem eigenen Code ruft der Destruktor auch die Destruktoren aller Attribute, die selbst Objekte sind, und der Basis-Objekte, falls es welche gibt, auf.
9 Initialisierungsliste: Diese steht (bei allen Konstruktoren und nur bei diesen) optional zwischen den Funktionsklammern ( ) und dem Code { }. Nach einem Doppelpunkt folgen die Konstruktoraufrufe von einigen oder allen Basisklassen und Attributen. So kann man selbst festlegen, mit welchem Konstruktor die Attribute erzeugt werden. Eine Initialisierungsliste ist Pflicht, falls wenigstens eine Basisklasse oder ein Attribut, das Objekt ist, keinen Standardkonstruktor besitzt; falls ein konstantes Attribut initialisiert werden muss; wenn ein Attribut eine Referenz ist. Darüber hinaus ist es oft effizienter, den Konstruktor selbst auszuwählen. Die Reihenfolge der Konstruktoraufrufe MUSS der Reihenfolge in der Objekt-Definition entsprechen (sonst gibt es Compiler-Warnungen): korrekt: Komplexe_Zahl(double r = 0, double i = 0): re{r}, im{i} {} falsche Reihenfolge: Komplexe_Zahl(double r = 0, double i = 0): im{i}, re{r} { } Seit C++11 darf eine Initialisierungsliste auch einen anderen Konstruktor derselben Klasse aufrufen (constructor delegation). Eine nicht sehr elegante Version hier: Komplexe_Zahl(double r, double i) : Komplexe_Zahl{r} // verwendet diesen ctor { im = i; } // und setzt nur noch den Imaginärteil Typ-Umwandlung durch Konstruktor: Konstruktoren, die mit genau einem Argument eines anderen Typs aufgerufen werden können, werden von C++ auch als Typumwandlungs- Funktionen verwendet. Im obigen Fall würde der Konstruktor Komplexe_Zahl(double r) (ruft Komplexe_Zahl(r, 0.) auf) auch als Umwandlungsfunktion von double in Komplexe_Zahl verwendet werden, was mathematisch sogar Sinn macht. Also wird man diese Zusatzfunktion dort wohl beibehalten. Bei den Brüchen ist die Umwandlung von Integern bei Bedarf in Brüche mit Nenner 1 ebenfalls sinnvoll. Bei den 2d- Vektoren will man jedoch Skalare auf keinen Fall in Vektoren umwandeln: Will man einen Konstruktor NICHT als Umwandlungsfunktion einsetzen, schreibt man vor ihn das Schlüsselwort explicit: Komplexe_Zahl(double = 0., double = 0.) ist auch Typumwandlung explicit Komplexe_Zahl(double = 0., double = 0.) ist keine.
10 Die Regel der großen Drei Das ist eine Faustregel in C++, die fast immer stimmt. Die großen Drei sind der Destruktor, der Copy-Konstruktor und der Kopier-Zuweisungsoperator operator=. Alle 3 werden von C++ u.u. automatisch erzeugt, wenn der Programmierer diese Methoden nicht selbst programmiert hat. Die Regel lautet: Benötigt eine Klasse unbedingt eine selbstgeschriebene Version von EINEM der großen Drei, benötigt sie ziemlich sicher selbstgeschriebene Versionen von ALLEN 3. Der Grundsatz gilt natürlich nicht, wenn man z.b. den Destruktor nur für Debugging-Zwecke geschrieben hat, damit er Log-Einträge erzeugt.
C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren
C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja Aue
Objekte wie Hund und Katz
Objekte wie Hund und Katz Wir wollen den Titel wörtlich nehmen und Hunde sowie Katzen als neue C++ Objekte (= eigener Datentyp) definieren. Dazu gibt es in C die Struktur (struct), in C++ zusätzlich die
C++ - Objektorientierte Programmierung Konstante und statische Elemente
C++ - Objektorientierte Programmierung Konstante und statische Elemente hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja
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
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
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
Prof. W. Henrich Seite 1
Klasse - ist ein benutzerdefinierter Datentyp (Referenztyp) - hat Datenelemente - hat Methoden - Konstruktor ist spezielle Methode zum Erstellen eines Objektes vom Typ der Klasse (Instanz) - jede Klasse
Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen
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
C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11
C++ Teil 12 Sven Groß 18. Jan 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 12 18. Jan 2016 1 / 11 Themen der letzten Vorlesung Wiederholung aller bisherigen Themen: Datentypen und Variablen Operatoren Kontrollstrukturen
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
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
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
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
Vorlesung Datenstrukturen
Vorlesung Datenstrukturen Objektorientierung in C++ (2) Beziehungen zwischen Klassen Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 530 Beziehungen zwischen Klassen Assoziation
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
Vorkurs Informatik: Erste Schritte der Programmierung mit C++
Vorkurs Informatik WS 14/15 Vorkurs Informatik: Erste Schritte der Programmierung mit C++ Tag 3: Objektorientiere Programmierung 8. Oktober 2014 Vorkurs Informatik WS 14/15 > Einführung Agenda 1 Einführung
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
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
HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2
HSR Rapperswil 2001 Markus Rigling Programmieren: Vererbung 1 Variante 2 Inhaltsverzeichnis: 1. Was ist Vererbung...3 2. Anwendung...3 3. Realisierung...3 4. Vorgehensweise zur Erstellung einer Kind-Klasse...3
C++ - Objektorientierte Programmierung Vererbung
C++ - Objektorientierte Programmierung Vererbung Personen Kunden Mitarbeiter Verwaltung Verkäufer Leibniz Universität IT Services Anja Aue Vererbung Definition von Klassen auf Basis von bestehenden Klassen.
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
Programmierkurs C/C++
Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Donnerstag Sandro Andreotti [email protected] WS 2008/09 1 Structs Blockkurs: "Einführung in C/C++" 2 Structs sind Bündel von Variablen (unter
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
Einstieg in die Informatik mit Java
1 / 24 Einstieg in die Informatik mit Java Klassen als Datenstrukturen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 24 1 Klassen als Datenstruktur 2 Vereinbarung von
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
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
Grundkurs C++ IDE Klassenhierarchien
Grundkurs C++ IDE Klassenhierarchien Martin Knopp 03.05.2017 Folie 1/34 GK C++: IDE, Klassenhierarchien Martin Knopp 03.05.2017 IDE Integrated Development Environment Wir empfehlen: Qt Creator (Bestandteil
C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern
C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung Eltern Kind Kind Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Implementierung von ist ein. bildet ein hierarchisches
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
Grundkurs C++ IDE Klassenhierarchien
Grundkurs C++ IDE Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016 Folie 1/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016 IDE Integrated Development Environment
Ü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
Aufbau von Klassen. class punkt {...
Einführung in C++ Aufbau von Klassen Eine wird mit dem Schlüsselwort class eingeleitet, und endet mit einem Semikolon. Der Inhalt wird zwischen geschweiften Klammern geschrieben. class punkt {... ; Im
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
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)
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
C++-Zusammenfassung. H. Schaudt. August 18, 2005
C++-Zusammenfassung H. Schaudt August 18, 2005 1 Datentypen 1.1 Grunddatentypen int (-32xxx bis +32xxx, implementerungs-abhängig) char -128 bis +128 float double bool (C++) int und char sind austauschbar:
Vererbung und Polymorphie
Vererbung und Polymorphie Marc Satkowski, Sascha Peukert 29. September 2016 C# Kurs Gliederung 1. Methodenüberladung 2. Vererbung Polymorphie Methoden- & Eigenschaftsüberschreibung Weitere Schlüsselwörter
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
Vokabeln. 4.1 Benutzer definierte Datentypen. Kapitel 4. Prof. Dr. Gerhard Berendt C++ oop? SS 2002 Arbeitsblatt 4
4.1 Benutzer definierte Datentypen C++ unterstützt die Einführung benutzer definierter Datentypen (auch Abstrakte Datentypen (ADT) genannt). ADTs bieten einen guten Einstieg in das Paradigma der objekt
1.4. Funktionen. Objektorientierte Programmierung mit C++
mehrfache Deklarationen sind erlaubt für jede Funktion muss es (GENAU) eine Definition geben, ansonsten linker error [the one definition rule ODR] Deklarationen in *.h - Files, Definitionen in *.cpp -
Ü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
Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen
1 Thema heute: Vererbung und Klassenhierarchien Abgeleitete Klassen Vererbung von Daten und Funktionen Virtuelle Funktionen 2 Vererbung oft besitzen verschiedene Datentypen einen gemeinsamen Kern Beispiel:
C++ - Operatoren. Eigene Klassen mit neuen Funktionen
C++ - Operatoren Eigene Klassen mit neuen Funktionen Übersicht Klassen bisher Eigene Operatoren definieren 2 Bisher Durch Kapselung, Vererbung und Polymorphy können nun eigene Klassen definiert werden,
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
Arrays. Einleitung. Deklarieren einer Array Variablen
Arrays Einleitung bisher jede Variable einzeln deklariert: 12 3 14 12 32 32 3 32 5 3 double sum; int count; ÿ Sie können Zweck und Aufbau von Array-Datentypen erklären ÿ Sie können einen Array korrekt
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
Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen
Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18
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
Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte
Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte entstehen durch... globale Objektvereinbarung: T o; blocklokale Objektvereinbarung: {.. T o;.. durch expliziten Aufruf
Programmieren in Java
Einführung in die Objektorientierung Teil 4 Interfaces, innere Klassen und Polymorphie 2 Vererbung im Klassendiagram (Wiederholung) Vererbung repräsentiert eine ist ein Beziehung zwischen Klassen Ware
Elementare Datentypen in C++
Elementare Datentypen in C++ bool signed/unsigned char signed/unsigned short int signed/unsigned int signed/unsigned long int (signed/unsigned long long int) float double long double void enum char Der
Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen
Objektorientierte Programmierung mit Grundlagen 27.10.2008 1 Übersicht 27.10.2008 2 1 Übersicht Klassen und Objekte in - Klassen - Objekte - Klassen - Objekte 27.10.2008 3 Übersicht 27.10.2008 4 2 Einführung
Ü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
einlesen n > 0? Ausgabe Negative Zahl
1 Lösungen Kapitel 1 Aufgabe 1.1: Nassi-Shneiderman-Diagramm quadratzahlen Vervollständigen Sie das unten angegebene Nassi-Shneiderman-Diagramm für ein Programm, welches in einer (äußeren) Schleife Integer-Zahlen
Repetitorium Informatik (Java)
Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen
Programmierung und Angewandte Mathematik
Programmierung und Angewandte Mathematik C++ /Scilab Programmierung und Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens SS 2012 Ziele Sie wissen, was Vererbung
1 Klassen und Objekte
1 Klassen und Objekte Datentyp - Spezifikation des Typs von Datenobjekten Datenstruktur - logische Ordnung von Elementen eines Datentyps - zur (effizienten) Speicherung, Verwaltung, Zugriff - auf die Elemente
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
Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung
Beispiele für Ausdrücke Der imperative Kern Deklarationen mit Initialisierung Variablendeklarationen int i = 10; int j = 15; Beispiele für Ausdrücke i+j i++ i & j i j [] [static]
Crashkurs C++ Wiederholung
Crashkurs C++ Wiederholung #include int main(void) { int i, j; bool is_prime; for (j = 1; j < 1000; j += 2) { is_prime = true; for (i = 3; i
Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg
Klassen und Objekte Einführung in Java Folie 1 von 28 12. Mai 2011 Ivo Kronenberg Inhalt Objekte Klassendefinitionen Datenelemente (Klassenattribute) Instanzieren von Objekten Konstruktoren Vergleich primitive
11.3 Virtuelle Methoden
11.3 Virtuelle Methoden Überdeckte Methoden: Betrachten wir noch einmal unsere Klassen Employee und Manager. class Employee void print() const cout
Programmieren in C/C++ und MATLAB
Programmieren in C/C++ und MATLAB Christian-Albrechts-Universität zu Kiel CAU 8-1 Objektorientiertes Programmieren Die Programme, die bisher in diesem Kurs verwendet wurden, sind alle klein und überschaubar
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
Einstieg in die Informatik mit Java
1 / 41 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 41 1 Überblick: Vererbung 2 Grundidee Vererbung 3 Verdeckte Variablen
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
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
OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik
(Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Klassen in C++ Beispiele, mit Aufzeigen der Trennung von Spezifikation und Implementierung
Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.
Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 23.5.07 G. Bohlender (IANM UNI Karlsruhe) Vererbung 23.5.07 1 / 22 Übersicht 1
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
Einstieg in die Informatik mit Java
1 / 39 Einstieg in die Informatik mit Java Objektorientierte Programmierung und Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 39 1 Überblick:
Vererbung, Polymorphie
Vererbung, Polymorphie Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 21.1.08 G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08
Objektorientierte Programmierung Studiengang Medieninformatik
Objektorientierte Programmierung Studiengang Medieninformatik Hans-Werner Lang Hochschule Flensburg Vorlesung 5 12.04.2017 Was bisher geschah... Objektorientierte Programmierung Klassen und Objekte, Attribute
Programmieren in C++ Templates
Programmieren in C++ Templates Inhalt Templates Funktions- und Klassen-Templates Spezialisierung von Templates Generische Klassen Einbinden von Templates Instantiierung (implizit und explizit) Templates
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
Konstruktor/Destruktor
1/23 Konstruktor/Destruktor Florian Adamsky, B. Sc. (PhD cand.) [email protected] http://florian.adamsky.it/ cbd Softwareentwicklung im WS 2014/15 2/23 Outline 1 2 3/23 Inhaltsverzeichnis 1 2
Einstieg in die Informatik mit Java
1 / 16 Einstieg in die Informatik mit Java Innere Klassen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 16 1 Einführung 2 Element-Klassen 3 Lokale Klassen 4 Anonyme Klassen
Systemnahe Programmierung in C/C++
Systemnahe Programmierung in C/C++ Peter Piehler [email protected] Lehrstuhl für Datenbanken und Informationssysteme Fakultät für Mathematik und Informatik 2006 12 13 Peter Piehler (DBIS) C/C++
Container/ Collection: Klasse die (Pointer auf ) andere Klassen oder Typen int,char,bool etc. aufnimmt.
Templates Container/ Collection: Klasse die (Pointer auf ) andere Klassen oder Typen int,char,bool etc. aufnimmt. Bsp.: einfach verkettete Liste Data Data Data Data Jeder Datenknoten nimmt ein Datenobjekt
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
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
Objektorientierung (OO)
Objektorientierung (OO) Objekte haben Zustände (oder Eigenschaften, Attribute) und Verhalten Zustände: Objektvariablen (in Java auch fields) Verhalten (oder Aktionen): Methoden (methods, Funktionen) members
Felder, Zeiger und Adreßrechnung
Felder, Zeiger und Adreßrechnung Felder bestehen aus Variablen eines einzigen Datentyps. Bisher kennen wir eindimensionale Felder. In C sind Felder mit beliebigen Dimensionen möglich. Unsere räumliche
Java Vererbung. Inhalt
Java Vererbung Inhalt 1 Zielsetzung... 2 1.1 Bewertung... 2 2 Grundlagen der Vererbung... 2 2.1 Super und Subklassen... 2 3 Überladen von Methoden... 4 3.1 Unterschiedliche Parameter... 4 3.2 Gleiche Parameter
Objektorientierte Programmierung Studiengang Medieninformatik
Objektorientierte Programmierung Studiengang Medieninformatik Hans-Werner Lang Hochschule Flensburg Vorlesung 2 22.03.2017 Was bisher geschah... Klassen und Objekte Attribute und Methoden Klasse Bruch
