1 KLASSENKOMPONENTEN. Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen

Ähnliche Dokumente
6 ZEIGER UND REFERENZEN - ALLGEMEINES

C++ - Objektorientierte Programmierung Konstante und statische Elemente

4 PROGRAMMSTRUKTUR - VEREINBARUNGEN

Einführung in die Programmierung mit C++

Prof. W. Henrich Seite 1

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

C++ Klassen weitere Funktionen

Objektorientierte Programmierung und Klassen

Klassen. Kapitel Klassendeklaration

Pods und Objects (Klassen)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

7. Übung Informatik II - Objektorientierte Programmierung

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

Programmieren in C++ Klassen

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

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

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

Einstieg in die Informatik mit Java

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 12

Vorlesungsprüfung Programmiersprache 1

Programmieren in C++ Überladen von Methoden und Operatoren

Einstieg in die Informatik mit Java

Einführung in die Programmierung

Repetitorium Informatik (Java)

7.2 Dynamischer Speicher in Objekten/Kopierkonstruktor

Mikrorechentechnik II. Klassen in C++

Pods und Objects (class und struct)

2 FUNKTIONSZEIGER UND BEHÄLTER

Einstieg in die Informatik mit Java

Prozeduren vs. Funktionen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Datenkapselung: public / private

Klassen als Datenstrukturen

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

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

Informatik 1 ( ) D-MAVT F2011. Klassen, Funktionen. Yves Brise Übungsstunde 9

10.4 Konstante Objekte

Einstieg in die Informatik mit Java

Programmiertechnik Klassenvariablen & Instantiierung

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Umsetzung einer Klassenkarte in einer Programmiersprache

3. Exkurs in weitere Arten der Programmierung

Vorkurs C++ Programmierung

Methoden. (Softwareentwicklung II (IB)) Prof. Dr. Oliver Braun. Letzte Änderung: :40. Methoden 1/44

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

Implementieren von Klassen

Einstieg in die Informatik mit Java

Überblick. 5. Objekt und Klasse, Elementfunktionen

Aufbau von Klassen. class punkt {...

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Programmieren in C/C++ und MATLAB

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

Kapitel 10. Verweise und Referenzen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

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

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

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

Objektorientierte Programmierung Studiengang Medieninformatik

Grundlagen der Informatik

Vererbung, Polymorphie

Tag 7 Repetitorium Informatik (Java)

3 Objektorientierte Konzepte in Java

3 Klassen, Attribute, Methoden

Grundelemente objektorientierter Sprachen (1)

Datenkapselung: public / private class rational { r.d = 0 int n; int d; // INV: d!= Klassen rational r; r.n = 1; // error: n is private

Grundelemente objektorientierter Sprachen (1)

Softwareentwicklung II (IB) Methoden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Vorlesung Datenstrukturen

Visuelle Kryptographie. Anwendung von Zufallszahlen

Repetitorium Programmieren I + II

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

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

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

Programmierkurs C/C++

Grundkurs C++ IDE Klassenhierarchien

Objektorientierte Programmierung mite**

Grundkurs C++ IDE Klassenhierarchien

6 ZEIGERARITHMETIK - ALLGEMEINES

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

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

Algorithmen und Datenstrukturen

Programmierung und Angewandte Mathematik

HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

Programmierkurs C/C++

Algorithmen und Datenstrukturen

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

Programmierung III. Pointer für Fortgeschrittene Marc Ruberg. Arrays von Pointern ( Zeigervektoren ): Pointer auf Pointer:

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

Programmieren in C++

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

Vokabeln. 4.1 Benutzer definierte Datentypen. Kapitel 4. Prof. Dr. Gerhard Berendt C++ oop? SS 2002 Arbeitsblatt 4

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

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

C++ - Objektorientierte Programmierung Vererbung

Transkript:

1 KLASSENKOMPONENTEN Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen zusammengesetzt. Die Komponentenfunktionen haben über eine Zeigervariable direkten Zugriff auf das Objekt. Die wesentlichen Eigenschaften einer Klasse können in einer Klassendeklaration angegeben werden, die sich auf eine Definition an anderer Stelle bezieht. Konstruktoren dienen zur Initialisierung der Datenkomponenten, hierzu gehört auch die Parameterübergabe und die Rückgabe von Funktionswerten. Werden Ressourcen alloziert, so ist in der Regel ein Destruktor erforderlich. Befreundete Funktionen haben dieselbe Aufrufsyntax wie Funktionen und Zugriff auf die Klassenkomponenten. Ähnliches gilt für statische Komp.funkt. Statische Datenkomponenten haben in allen Objekten den gleichen Wert.

1 KLASSENKOMPONENTEN - THEMENÜBERSICHT Vereinbarungen innerhalb von Klassen Gültigkeitsbereich bei Klassen I,II, Zugriffsattribute Komponentenfunktionen und this-zeiger Konstante Komponentenfunktionen Konstruktoren - Eigenschaften Konstruktorinitialisierungsliste Spezielle Konstruktoren Zuweisungsoperator Statische Komponentenfunktionen Statische Datenkomponenten

Vereinbarungen innerhalb von Klassen 1. Datenkomponenten (konstant/nichtkonstant, statisch/nichtstatisch) 2. Komponentenfunktionen (konstant/nichtkonstant, statisch/nichtstatisch) 3. Konstruktoren (Spezialfälle: Standardkonstruktoren, Kopierkonstruktoren) 4. Destruktoren 5. Befreundete Funktionen Für Komponentenfunktionen Definition innerhalb der Klasse oder Deklaration innerhalb der Klasse und nachfolgender Definition außerhalb möglich. Konstruktoren und Destruktoren zählen zwar zu den Komponentenfunktionen, besitzen aber eine spezielle Vereinbarungs- und Aufrufsyntax. Befreundete Fkt. gehören nicht zu den Klassenkomp. Klassenobjekte enthalten weder Funktionen noch statische Datenkomponenten.

Gültigkeitsbereich bei Klassen - Komponentenname Def.: Teil des Programms, in dem ein Name bekannt ist Gültigkeitsbereich (scope) eines Komponentennamens: 1. Ab Vereinbarungspunkt bis zum Ende der Klassenvereinbarung 2. Alle Funktionsrümpfe, Konstruktorinitialisierungen und Parametervoreinstellungen der Komponentenfunktionen der Klasse (auch rückwärts und außerhalb!) Reihenfolge der Komponentenfunktionen soll (und darf!) keinen Einfluss auf die Programmbedeutung haben Reihenfolge der Datenkomponenten nicht ganz unwichtig (Initialisierungsreihenfolge) Verwendung von Komponenten außerhalb ihrer Klasse Betrachte Klasse C, Klassenkomponente comp und Objekt c Objektkomponente ansprechbar mit c.comp und (&c)->comp Komponente ohne Objektbezug ansprechbar mit C::comp, z.b. Definition außerhalb der Klasse

Gültigkeitsbereich bei Klassen - Klassenname Gültigkeitsbereich eines Klassennamens: Ab Vereinbarungspunkt bis zum Ende der Übersetzungseinheit (wie bei Variablen außerhalb von Funktionen) Beschränkung hier auf Klassen, die außerhalb von Funktionen vereinbart sind. Reihenfolge der Klassenvereinbarungen kann wichtig sein forward-deklaration von Klassen möglich (später!) Zugriffsattribute Geben an, welche Funktionen Zugriff auf Komp.namen haben public - alle private - Komponentenfunktionen und mit der Klasse befreundete Funktionen protected - später

Komponentenfunktionen - this this: Zeiger auf das Objekt, für das die Komponentenfunktion aufgerufen wurde In c.f(): this ˆ= &c bzw. *this ˆ= c Bsp.: class Complex { Complex quadriere() { double re2=re*re-im*im, im2=2*re*im; re=re2; im=im2; return *this; } }; Quadrieren ändert Objekt (Seiteneffekt) Wert des Ausdruck z.quadriere(): geändertes z Einsatz von this-zeigern manchmal zur Verdeutlichung, dass Komponentenfunktionen auf Objekten operieren: Bsp.: double real() { return (*this).re; }

Konstante Komponentenfunktionen Konstante Komp.funktionen dürfen Objekt nicht verändern Kennzeichn. durch const-attribut (nach Parameterliste!) T f() const Aufruf durch c.f(), falls c Variable, Konstante, Referenz oder Referenz auf Konstante T f() Aufruf durch c.f(), falls c Variable oder Referenz Bsp.: double real() const { return re;} Erforderlich bei Anwendung auf Konstanten oder Referenzen auf Konstanten Unterscheidung später wichtig bei Implementierung von Behältertypen (Indexoperator) Unterschiedliche Datentypen für this-zeiger: C *this nichtkonstante Komponentenfunktion const C *this konstante Komponentenfunktion

Konstruktoren - Eigenschaften Zweck: Initialisierung eines Klassenobjekts - ggf. Allokation und Belegung des unformatierten Speicherplatzes (raw storage) Name der Konstruktorfunktion Klassenname Kein Ergebnistype, auch nicht void Konstruktoren gehören wie Destruktoren zu den Komponentenfunktionen Expliziter Aufruf: C(), nicht c.c() const-attribut unzulässig, dennoch Initialisierung auch von konstanten Objekten möglich Unterschiedliche Konstruktoren in einer Klasse möglich, am wichtigsten: Standardkonstruktor und Kopierkonstruktor - werden u.u. automatisch erzeugt, falls nicht definiert.

Konstruktorinitialisierungsliste Zweck: Erstinitialisierung einzelner Datenkomponenten entsprechend den Konstruktorargumenten vor Ausführung des Konstruktorblocks Bsp.: class Polynom { vector<double> a; // Pol.koeff. // vector<double> a(n+1); // unzulaessig Polynom(int n): a(n+1) {a[n]=1;} // Konstruktor fuer Monom x^n } Erstinitialisierung nach Vereinbarungsreihenfolge der Komponenten, nicht nach Reihenfolge in der Konstr.initial.liste Nicht in der Konstr.initial.liste aufgeführte Komponenten werden mit dem Standardkonstruktor (Klassen) initialisiert. Weitere Zuweisungen im Konstruktorblock möglich Initialisierung von Komp., die Konstanten oder Referenzen sind, in C++98 nur über die Konstr.inital.liste möglich

Spezielle Konstruktoren Standardkonstruktor (default constructor) Standardkonstruktor Konstr. mit leerer Argumentliste Ggf. automatische Erzeugung mit Zugriffsattribut public: Ruft Standardkonstruktoren auf (Klassen), initialisiert aber nicht Datenkomponenten (eingebaute Typen) Einsatz z.b. bei der Vereinbarung einer Klassenvariable ohne Argumentliste Kopierkonstruktor (copy constructor) Initialisiert ein Klassenobjekt durch ein anderes Parametertyp: C& bzw. const C& Unzulässig: C bzw. const C Ggf. automatische Erzeugung mit Zugriffsattribut public: Initialisiert Komponenten durch Zuweisung (eingebaute Datentypen) bzw. durch ihre Kopierkonstruktoren (Klassen) Einsatz z.b. bei Parameterübergaben oder Rückgabe von Funktionswerten Keine Verwendung bei Zuweisungen!

Destruktor Zweck: Vernichtung eines Klassenobjekts mit dem Ziel der Freigabe des belegten Speicherplatzes Funktionskopf: ~C() Kein Ergebnistyp, auch nicht void Ggf. automatische Erzeugung mit Zugriffsattribut public: Ruft Destruktoren der Datenkomponenten in umgekehrter Vereinbarungsreihenfolge auf Destruktoren vor allem nötig zur Freigabe dynamisch allozierten Speichers Explizite Destruktoraufrufe: nur selten erforderlich Implizite Destruktoraufrufe: Blockende für automatische Variablen, Programmende für statische Variablen In der Regel keine garbage collection in C++, aber fast derselbe Effekt mit korrekt geschriebenen Destruktoren Verwendung der STL-Behälter macht Schreiben von Destruktoren oft überflüssig

Zuweisungsoperator Überladen des Gleichheitszeichens nur durch Komp.fkt.: a=b a.operator=(b) Parametertyp: C bzw. C& bzw. const C& Ggf. automatische Erzeugung mit Zugriffsattribut public: Nimmt Zuweisungen für Datenkomponenten vor (eingebaute Datentypen) bzw. ruft ihre Zuweisungsoperatoren auf (Klassen) Bereits erwähnt: Zuweisungsoperator Kopierkonstr. Ein Unterschied: Zuweisung nur an initialisierte Objekte Vorsicht: Gleichheitszeichen in Variablendef. bewirkt Aufruf des Kopierkonstruktors und nicht des Zuweisungsoperators Unterschied zum Kopierkonstruktor beim vektor-beispiel delete-aufruf, weil interner C-Vektor bereits belegt ist und evtl. die Länge geändert wird

Statische Datenkomponenten Zweck: Speicherung von Werten, die in allen Objekten einer Klasse gleich sind. Bsp.: struct Kreis { double r; static const double pi; } const double Kreis::pi = acos(-1.0) Deklaration innerhalb der Klasse Definition außerhalb der Klasse mit Namenszugriffoperator Statische Datenkomponenten oft besser als globale Variable Größe von Objekten durch die Hinzunahme statischer Datenkomponenten unverändert Anmerkung: Die Größe der Objekte hängt nur von der Größe (und Anordnung) der nichtstatischen Daten komponenten ab. Ausnahme: Virtuelle Funktionen (später!)

Statische Komponentenfunktionen Deklarationsangabe static (anstelle von friend) Zugriff auf die privaten Komponenten von Klassenobjekten Jedoch: Kein this-zeiger Außerhalb Klasse: Aufruf durch C::f() [sogar c.f() möglich, c. wird ignoriert] Innerhalb Klasse: Aufruf auch möglich, wenn kein Parameter vom Klassentyp vorhanden. (Unterschied zu friend-funktionen!) Vereinbarungsreihenfolge innerhalb der Klasse unwichtig (wie bei normalen Komponentenfunktionen, Konstruktoren und Destruktoren) Falls public, Wirkung ähnlich wie befreundete Funktionen. Vermeidung von Namenskonflikten Falls private, gut geeignet für Hilfsfunktionen, die in der Klasse untergebracht werden sollen, aber keinen Parameter vom Klassentyp haben

Vergleich befreundeter Fkt. und stat. Komp.fkt. Befreundete Funktionen gehören nicht zur Klasse, selbst wenn sie dort definiert sind. [Verhalten als ob unmittelbar nach der Klasse definiert] Zugriff auf die privaten Klassenkomponenten, kein this-zeiger (ebenso wie bei stat. Komp.fkt.) Außerhalb der Klasse: Aufruf durch f() (ab Vereinbarungspunkt) Beliebige Vereinbarungsreihenfolge in der Klasse wie bei Komponentenfunktionen (sofern mindestens ein Parameter vom Klassentyp vorhanden) STL: häufiger befreundete Funktionen als statische Komponentenfunktionen [Durch Includedateien Einschub der Klassendefinition und somit auch der befreundeten Funktionen, daher direkter Aufruf von f() möglich, C::f() wäre umständlicher]