170 likes | 296 Views
Einführung in die Programmiersprache C/C++. “Donnerstag” Andreas Döring doering@inf.fu-berlin.de SS 2004. Member-Funktion kennt ihr Objekt. Bei dem Aufruf einer Member-Funktion weiß diese, zu welchem Objekt der Aufruf geschieht: struct Hamster { void fuettern() {
E N D
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ “Donnerstag” Andreas Döring doering@inf.fu-berlin.de SS 2004
Seminar: "Einführung in C/C++" Member-Funktion kennt ihr Objekt Bei dem Aufruf einer Member-Funktion weiß diese, zu welchem Objekt der Aufruf geschieht: struct Hamster { void fuettern() { ++Gewicht; } int Gewicht; }; Hamster billy; billy.fuettern(); erhöhe billy.Gewicht
Seminar: "Einführung in C/C++" Der this-Pointer In einer Member-Funktion zeigt der this-Pointer auf das aktuelle Objekt: struct Hamster { void fuettern() { ++( this->Gewicht ); } int Gewicht; }; this hat den TypHamster *
Seminar: "Einführung in C/C++" Ctors und Dtor Konstruktoren: Aufruf bei Erzeugung eines Objekts. Destruktor: Aufruf bei der Zerstörung eines Objekts. Konstruktor ohne Argument: „Default Ctor“ struct Hamster { Hamster() { } };
Seminar: "Einführung in C/C++" Ablaufplan beim Erzeugen/Zerstören Objekt erzeugen: • Rufe Default Ctors der Basisklassen auf. • Rufe Default Ctors der Member-Variablen auf. • Rufe den Ctor des Objektes selbst auf. (Ablaufplan bei Zerstörung: Übungsaufgabe)
Seminar: "Einführung in C/C++" Objekte kopieren Es gibt zwei Fälle, in denen Objekte kopiert werden: 1. Initialisierung: Hamster billy; Hamster sunny = billy; 2. Zuweisung: Hamster billy, sunny; sunny = billy;
Seminar: "Einführung in C/C++" 1. Kopieren bei Initialisierung Objekte werden mit dem Copy Konstruktor bei der Initialisierung kopiert: struct Hamster { Hamster() { Alter = 0; } Hamster(Hamster const & ham){ Alter = ham.Alter; } int Alter; }; Hamster billy; Hamster sunny = billy;
Seminar: "Einführung in C/C++" Copy-Ctor im Detail Hamster (Hamster const & ham) { Alter = ham.Alter; } Anmerkungen: • Das Argument ham ist const: Es wird durch den CTornicht verändert. • Alternative Schreibweise für Initialisierung: Hamster billy; Hamster sunny(billy);
Seminar: "Einführung in C/C++" 2. Kopieren bei Zuweisung Bei Zuweisungen wird statt dessen der assignment-Operator ausgeführt: struct Hamster { ... Hamster & operator= (Hamster const & ham) { Alter = ham.Alter; return *this; } int Alter; }; Hamster billy, sunny; sunny = billy;
Seminar: "Einführung in C/C++" operator= im Detail Hamster &operator= (Hamster const & ham) { Alter = ham.Alter; return *this; } Anmerkungen: • Argument ham ist const: Es wird durch operator=nicht verändert. • Es wird das Objekt selbst zurückgegeben: *this • Der Typ der Rückgabe ist Hamster &.
Seminar: "Einführung in C/C++" Operatoren überladen Man kann fast alle Operatoren überladen. Ausnahmen (u.a.): . (Member selection) :: (Scope resolution) Zwei Möglichkeiten: • Durch Member-Funktion • Durch globale Funktion
Seminar: "Einführung in C/C++" 1. Operatoren als Member-Funktion • unäre Operatoren: Wirken aufs aktuelle Objekt Hamster & Hamster::operator~ () {...} • binäre Operatoren: Aktuelles Objekt steht links. Hamster & Hamster::operator+ ( int const right ) { ... }
Seminar: "Einführung in C/C++" 2. Operatoren als globale Funktion • unäre Operatoren: Hamster & operator~ (Hamster const & hams) {...} • binäre Operatoren: Aktuelles Objekt steht links. Hamster & operator+ (Hamster const & left, int const right) { ... }
Seminar: "Einführung in C/C++" virtuelle Funktionen (1) Das Problem: sei z.B. folgendes Programm gegeben: struct Auto { void tanken() { std::cout << "Benzin"; ...} void starten() { if (Tankfuellung == 0) tanken(); ... } }; struct Solarmobil: Auto { void tanken() { std::cout << "Sonne"; ... } };
Seminar: "Einführung in C/C++" virtuelle Funktionen (2) ... Solarmobil mob; mob.starten(); Ausgabe: Benzin Grund: Die Basisklasse Auto kennt die abgeleitete Klasse Solarmobil nicht. void starten() { tanken(); this-Pointer hat Typ Auto * }
Seminar: "Einführung in C/C++" virtuelle Funktionen (3) Lösungsmöglichkeit: virtual struct Auto { virtual void tanken() { ...} }; ... Solarmobil mob; mob.starten(); //Ausgabe: "Sonne"
Seminar: "Einführung in C/C++" Standardlibraries Standard Headerdateien: <algorithm> <bitset> <cassert> <cctype> <cerrno> <cfloat> <ciso646> <climits> <clocale> <cmath> <complex> <csetjmp> <csignal> <cstdarg> <cstddef> <cstdio> <cstdlib> <cstring> <ctime> <cwchar> <cwctype> <deque> <exception> <fstream> <functional> <hash_map> <hash_set> <iomanip> <ios> <iosfwd> <iostream> <istream> <iterator> <limits> <list> <locale> <map> <memory> <new> <numeric> <ostream> <queue> <set> <sstream> <stack> <stdexcept> <streambuf> <string> <strstream> <utility> <valarray> <vector>