Beruflich Dokumente
Kultur Dokumente
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Programm
cerr clog
stderr
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Ausgabeströme - Standardausgabe
– Vordefinierte Output-Stream-Objekte
cout
cout gepufferte Standardausgabe
ostream-
Objekte cerr
cerr ungepufferte Standardfehlerausgabe
clog
clog gepufferte Standardfehlerausgabe
– Ausgabeoperator
Methode: Ausgabeoperator (inserter) << <iostream.h>
Aufruf: ostream-Objekt << Ausdruck [<< Ausdruck [...]];
Wirkung: Der Ausdruck wird bewertet, konvertiert und formatiert als
Zeichenkette ausgegeben. Eine Verkettung mehrerer
Ausgaben ist möglich.
• Beispiel
cout << 3 << "-mal schwarzer Kater " << endl;
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Ausgabeströme
– Überladung des Ausgabeoperators z.B. für fol-
gende Standarddatentypen
ostream& operator<<(bool)
ostream& operator<<(char)
ostream& operator<<(unsigned char)
ostream& operator<<(const char*)
ostream& operator<<(short)
ostream& operator<<(unsigned short)
ostream& operator<<(int)
ostream& operator<<(unsigned int)
ostream& operator<<(long)
ostream& operator<<(unsigned long)
ostream& operator<<(float)
ostream& operator<<(double)
ostream& operator<<(long double)
ostream& operator<<(void*)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
– Ausgabe?
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Pufferung - Beispiel
#include <iostream>
#include <time.h> – In welchen
using namespace std; zeitlichen
void main(void)
{
Abständen
// verstrichene Sekunden seit 1.1.1970 erfolgt die
time_t Start = time(NULL);
Ausgabe ?
clog << " Zunaechst nach clog,\n";
// 10 Sekunden warten
while (time(NULL) < Start+10);
cerr << " dann nach cerr,\n";
// weitere 10 Sekunden warten
while (time(NULL) < Start+20);
cout << " zuletzt nach cout.\n";
// weitere 10 Sekunden warten
while (time(NULL) < Start+30);
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Formatierte Ausgabe
– Alternativen
• Manipulatoren
• Funktionen/Methoden der Ausgabeobjekte
– Manipulatoren
• Es existieren parameterlose Manipulatoren und solche mit
Parametern
• Parametrisierte Manip. benötigen eine Header-Datei
#include <iomanip>
• Manip. werden durch „<<“ in den Ausgabestrom eingefügt
• Manip. sind Zeiger auf Memberfunktionen der IO-Objekte.
– Die Shiftoperatoren sind auch für diese Zeiger überladen
Es wird eine Memberfunktion durch das Einfügen eines
Manipulators aufgerufen
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Formatierte Ausgabe
– Direkte Verwendung der Memberfunktionen
• Diese greifen auf abfragbare und veränderbare Format-
bits (ios::flags) zu
• Beispiele für Synonyme
cout.fill('.'); cout << setfill('.');
cout.width(10); cout << setw(10);
cout.setf(ios::left); cout << setiosflags(ios::left);
cout.unsetf(ios::left); cout << resetiosflags(ios::left);
cout.precision(3); cout << setprecision(3);
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
#include <iostream>
Forma- #include <iomanip>
using namespace std;
tierte
void main(void)
Aus- {
char *obstArr[] = {"Apfel", "Birne", "Banane"};
gabe float preisArr[] = {0.25F, 0.30F, 0.50F};
float mwst = 0.19F;
– Beispiel
cout.width(45);
• Ausgabe? cout << "Unser Angebot\n\nObst\t\tNetto\tBrutto"<<endl;
for (int count = 0; count < 3; count++)
{
cout.fill('.');
cout << setiosflags(ios::left)<< setw(16)
<< obstArr[count]
<< resetiosflags(ios::left) << setw(5)
<< fixed << setprecision(2) << setfill(' ')
<< preisArr[count]
<< setw(9)
<< preisArr[count]*(1+mwst) << endl;
}
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Formatierte Ausgabe
– Beispiel
#include <iostream>
using namespace std;
void main(void)
{
int a = 1, b = 2, c = 3;
cout << "A + B + C = " << a + b + c << endl;
cout << "A ^ B | C = " << (a ^ b | c) << endl;
cout << " A << B = " << (a << b) << endl;
}
• Ausgabe? A + B + C =
A ^ B | C =
A << B =
• Klammern notwendig?
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Weitere Ausgabefunktionen
– Methode zur Einzelzeichenausgabe
Methode: ostream& put(char ch); <iostream>
Wirkung: Die Funktion put gibt das vorgegebene Zeichen ch aus.
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Eingabeströme - Standardeingabe
– Vordefiniertes Input-Stream-Objekt (istream)
• cin
cin Standardeingabeobjekt zum Einlesen von Daten
über die Tastatur
– Eingabeoperator
Methode: Eingabeoperator (extractor) >> <iostream>
Aufruf: istream-Objekt >> L-Wert [>> L-Wert [...]];
Wirkung: Die eingegebenen Daten werden in den Typ der übergebe-
nen Variablen konvertiert (übergeben werden Referenzen).
Führende Whitespaces (Leerzeichen, Tab, Zeilenumbruch)
werden überlesen. Die folgenden Zeichen werden solange
in den gewünschten Typ konvertiert, bis ein Zeichen auf-
tritt, das nicht konvertiert werden kann. Dieses und alle
weiteren Zeichen verbleiben im Eingabepuffer.
Eingabeströme
– Überladung des Eingabeoperators z.B. für fol-
gende Standarddatentypen
istream& operator>>(bool&)
istream& operator>>(char&)
istream& operator>>(unsigned char&)
istream& operator>>(char*)
istream& operator>>(short&)
istream& operator>>(unsigned short&)
istream& operator>>(int&)
istream& operator>>(unsigned int&)
istream& operator>>(long&)
istream& operator>>(unsigned long&)
istream& operator>>(float&)
istream& operator>>(double&)
istream& operator>>(long double&)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
#include <iostream>
Formatierte #include <iomanip>
using namespace std;
Eingabe
void main(void)
– Beispiel {
• Ausgabe? char buchstabe1, buchstabe2, buchstabe3;
char string[5];
int zahl;
cout << "Geben Sie drei Buchstaben ein:\n";
cin >> buchstabe1 >> buchstabe2 >> buchstabe3;
cout << "Die Eingabe war: "
<< buchstabe1 << ", "
<< buchstabe2 << ", "
<< buchstabe3 << endl;
cout << "\nGeben Sie eine Hex-Zahl ein:\n";
cin >> hex >> zahl;
cout << "Die Eingabe war: " << zahl << endl;
cout << "\nGeben Sie einen String ein: \n";
cin >> setw(sizeof(string)) >> string;
cout << "Die Eingabe war: " << string << endl;
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Weitere Eingabefunktionen
– „Nur-Lesen“ eines Zeichens
Methode: int peek(); <iostream>
Wirkung: Liefert das nächste Zeichen zurück, entnimmt es aber nicht.
– Zeilenweises Lesen
Methode: istream& getline(char*, int len, char='\n'); <iostream>
Wirkung: Die Elementfunktion getline entnimmt solange Zeichen und speichert
sie über den vorgegebenen Parameter (char *) ab, bis sie auf ein
Begrenzungszeichen (dritter Parameter) oder auf das Dateiende-Zeichen
(EOF) stößt, oder aber bis (len - 1) Bytes gelesen worden sind. Dabei
wird stets ein abschließendes Nullzeichen in den String geschrieben. Das
Begrenzungszeichen wird aus dem Eingabe-Stream entnommen aber
nicht gespeichert.
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Weitere Eingabefunktionen
– Blockweises Lesen
Methode: istream& read( char*, int n); <iostream>
Wirkung: Die Elementfunktion read entnimmt maximal n Zeichen aus dem Einga-
bestream. Stößt sie auf das Dateiende-Zeichen (EOF), wird der Lesevor-
gang abgebrochen.
(Sie wird auch für das blockweise Lesen aus Binärdateien verwendet.)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
#include <iostream> Weitere Eingabefunktionen
Weitere Eingabefunktionen
#include <iomanip>
using – Blockweises
namespace std; Lesen– Beispiel
void main(void)
{
int zahl;
cout << "Zahleneingabe: ";
cin >> zahl;
cout << zahl << " * " << zahl << " = " << zahl*zahl << endl;
cout << "weiter mit beliebiger Taste >";
cin.get(); // auf Tastendruck warten - funktioniert das ?
cout << "\n\nZahleneingabe: ";
cin– Überlesen
>> zahl; einer Eingabefolge
cout << zahl << " * " << zahl << " = " << zahl*zahl << endl;
cin.ignore(9999,'\n');
cout << "Ende mit beliebiger Taste > ";
cin.get(); // auf Tastendruck warten - funktioniert's diesmal?
cout << "und tschuess!!";
cin.peek(); // probieren Sie mal
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Stream-Status
– Alle Streamobjekte (cin, cout, ...) besitzen ein
Statusfeld
• Dort wird in Form von Flags abgespeichert, ob ein Objekt
weiterhin einsetzbar ist oder nicht
• Die Abfrage der Flags kann über Elementfunktionen und
vordefinierte Konstanten geschehen
Flag/Konstante Bedeutung
ios::goodbit Alles i.O., kein anderes Flag gesetzt
ios::eofbit End of File erreicht
ios::failbit Letzter Vorgang nicht korrekt abgeschlossen
(z.B. int soll eingelesen werden, Buchstabe
steht im Streampuffer)
ios::badbit Fataler Fehler, Zustand nicht definiert
(z.B. Positionieren des Dateizeigers vor dem
Dateianfang)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Stream-Status
– Methoden zur Abfrage
Abfragefunktion Bedeutung
good() true, wenn alles i.O. ist (goodbit gesetzt)
eof() true bei End of File (eofbit gesetzt)
fail() true bei Fehler (failbit oder badbit gesetzt)
bad() true bei fatalem Fehler (badbit gesetzt)
• Beispiel
int wert;
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Stream-Status
– Im Fehlerfall (failbit, badbit) blockiert ein
E/A-Objekt
• Weitere Operationen sind erst möglich, wenn die Fehler-
flags zurückgesetzt werden
• Funktionen zum Lesen und (Rück)Setzen der Fehlerflags
Funktion Bedeutung
rdstate() Liefert die Fehlerflags
• Beispiel
setstate() Setzt zusätzliche Flags
int wert;
clear() Löscht und setzt einzelne Flags
cin >> wert;
• Beispiel
if (!cin.good())
{
cout << "Fehler beim Einlesen !!";
cin.clear(); // clear ohne Parameter loescht alle Fehlerflags
cin.clear(cin.rdstate()&~ios::failbit); //nur failbit loeschen
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Stream-Status
– Bewertung des Zustandes auch über zwei vor-
definierte Statuskurzabfragen möglich
Funktion Bedeutung
operator void*() Liefert, ob Stream in keinem Fehlerzustand ist
(entspricht !fail())
operator!() Liefert, ob Stream in einem Fehlerzustand ist
(entspricht fail())
– Anmerkung
• Der neue Standard sieht vor, dass Fehler sog. Ausnah-
men (exceptions, s. Kap. 10) auslösen können
• Die Defaulteinstellung ist jedoch, dass keine Ausnahmen
geworfen werden
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Stream-Status
– Beispiel zu Statuskurzabfragen
int wert;
// operator !
if (!cin) // if (!(cin >> wert)) ... auch moeglich
{
// Einlesen schlug fehl !!
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
– wert wird wie eine globale Variable mit dem Wert 0 initiali-
siert
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Dynamische Speicherverwaltung
– Alternativen der Speicherverwaltung
• Bibliotheksfunktionen: malloc(), calloc(), free()
• Operatoren: new, delete
Methode: new <iostream>
Aufruf: Typ* pObjekt;
pObjekt = new Typ;
pObjekt = new(Typ);
pObjekt = new Typ(Initialisierungsliste);
pObjekt new Typ[Anzahl];
void= main()
Wirkung: • Reserviert
{ Speicherplatz für ein Objekt
• Berechnet int wert = int();
typspezifisch die Größe des zu reservierenden Speichers
• Initialisiert
... das Objekt ggf. - Initialisierungsliste (bzw. Konstruktor; bei
Arrays wird} der Standardkonstruktor für jede Komponente aufgerufen)
• Gibt einen typisierten Zeiger auf den allokierten Speicherplatz zurück
(NULL bzw. 0, falls kein Speicher reserviert werden konnte Ergebnis
überprüfen !)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
delete pB;
delete pA;
Übersicht
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
– Objektdefinition
KlassenName ObjektName;
• Erzeugt eine Instanz der Klasse mit Namen ObjektName
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Klassendefinition - Beispiel
#include <iostream> cratio1.h
using namespace std;
// Klassendefinition
struct CRatio
{
// Elementfunktionen
void Eingabe()
{
do
{
cin >> zae >> nen;
if (nen==0) cerr << "\n Nenner==0!\n Eingabe wiederholen: ";
} while(nen == 0);
}
void Ausgabe() { cout << zae << "/" << nen << endl; }
// Datenelemente
int zae, nen; // Zaehler, Nenner
};
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Objektdefinition/-verwendung - Beispiel
#include "cratio1.h"
#include <iostream>
using namespace std;
void main()
{
CRatio ersteZahl, zweiteZahl; // Objektdefinition
CRatio *pCRatio = &ersteZahl;
cout << "ErsteZahl = ";
ersteZahl.Eingabe(); // Methodenaufruf
zweiteZahl.zae = 5; // ebenfalls moeglich
zweiteZahl.nen = 0; // Problem !!!
cout << "ErsteZahl = ";
pCRatio->Ausgabe(); // Methodenaufruf ueber Zeiger
(*pCRatio).Ausgabe(); // Alternative
cout << "ZweiteZahl = ";
zweiteZahl.Ausgabe(); // oder wie gehabt...
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Zugriffskontrolle
– C++ - Klassen unterstützen ADT durch die
Möglichkeit der Zugriffsbeschränkung
– Schutzbereiche
private: Alle Komponenten sind nur innerhalb der Klasse sichtbar,
d.h. private Komponenten können nur von Komponenten
der eigenen Klasse und von „Freunden“ referenziert werden.
Attribute sind in der Regel private.
public: Auf Komponenten nach public: kann ungehindert auch
von außen zugegriffen werden.
Schnittstellenfunktionen sind i.a. public.
protected: protected wirkt nach außen wie private, jedoch ist der
Zugriff für Komponenten abgeleiteter Klassen möglich.
• Kurz
– public: Von jedem verwendbar
– private: Nur von eigenen Methoden zugreifbar
– protected: Von eigenen Methoden und denen abgelei-
teter Klassen zugreifbar
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
4.3 Zugriffskontrolle
Zugriffskontrolle
– Standardmäßig sind die Komponenten bei
Klassendefinition mit
• class im Schutzbereich private und bei
• struct und union im Bereich public
– Anmerkungen
• Von den Voreinstellungen sollte kein Gebrauch gemacht
werden; besser ist es, den Zugriff explizit anzugeben
• In der Regel werden public-Komponenten immer an
den Anfang der Definition gestellt, da sie für den Benut-
zer der Klasse wichtig sind
• Es dürfen auch mehrere Abschnitte mit public:,
private: bzw. protected: vorkommen
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Zugriffskontrolle
– Anmerkungen zu class als Klasse
• Der Schutz ist definitionsgemäß „sicher“ eingestellt
• Sollte nach Möglichkeit verwendet werden
– Anmerkungen zu union als Klasse
• Eine union darf nicht enthalten
– Statische Member
– Klassenobjekte, deren Klassendefinition einen Konstruktor,
einen Destruktor oder einen selbstdefinierten Zuweisungs-
operator enthält
• Eine union darf keine Basisklassen besitzen und auch
selbst nicht als Basisklasse verwendet werden
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
4.3 Zugriffskontrolle
Memberfunktionen
– Einteilung in vier Kategorien
• Verwaltungsfunktionen - public
– Funktionen zur Initialisierung, Speicherverwaltung oder
Konvertierungen, etc.
– Im allgemeinen implizit aufgerufen (Vertreter: Konstrukto-
ren, Destruktoren)
• Ausführungsfunktionen - public
– Stellen den eigentlichen Dienst zur Verfügung, für den die
Klasse entworfen wurde
• Hilfsfunktionen - private
– Dienen zur Strukturierung und Unterstützung anderer
Memberfunktionen
• Zugriffsfunktionen - public
– Ermöglichen den Zugriff (r/w) auf private Memberdaten
– Die Definition von Memberfunktionen kann innerhalb oder
außerhalb der Klassendefinition stattfinden
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
4.4 Memberfunktionen
Memberfunktionen
– Definition innerhalb oder außerhalb einer
Klasse möglich
– Definition innerhalb einer Klasse
• Implizite inline - Definition
• Alle Elementfunktionen,
die innerhalb einer #include <iostream> cratio3.h
Klasse vollständig // Klassendefinition
definiert werden, sind class CRatio
{
automatisch inline
public:
• Beispiel // Elementfunktionen - implizit inline
void Init() {zae=0; nen=1;}
void Eingabe() { ... }
void Ausgabe() { ... }
...
};
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Memberfunktionen
– Definition außerhalb einer Klasse
• In der Klassendefinition werden nur die Prototypen der
Elementfunktionen angegeben
• Über den binären scope resolution - Operator :: wird
außerhalb bei der Definition festgelegt, zu welcher Klas-
se die Elementfunktion gehört
KlassenName::ElementBezeichner
– Entspricht der Qualifizierung bei Namensräumen
• Ermöglicht eine Trennung von Schnittstellendeklaration
und Implementierung im Sinne der ADTen
– Die genaue Implementierung eines ADTen ist irrelevant
und sollte nicht vom Anwender in einer bestimmten Form
vorausgesetzt werden
• Bei externen Definitionen muss inline explizit ange-
geben werden (falls so gewollt)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
4.4 Memberfunktionen
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
4.4 Memberfunktionen
Schnittstelle
– Beispiel mit teilweiser Trennung
// Definition der Klasse CRatio cratio5.h
#ifndef CRATIO5_H
#define CRATIO5_H
#include <iostream>
class CRatio
{
public:
// Prototypen der Elementfunktionen
void Init() {zae = 0; nen = 1;} inline void CRatio::Ausgabe()
void Eingabe(); {
void Ausgabe(); std::cout << zae << "/"
private: << nen << std::endl;
// Datenelemente }
int zae, nen; //Zaehler, Nenner
}; #endif
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
4.4 Memberfunktionen
(Externe) inline-Memberfunktionen
– Vor-/Nachteile von inline-Memberfunktionen
• Vorteile
– Geschwindigkeitssteigerung
– Eine externe inline-Definition kann leichter rückgängig
gemacht werden
• Nachteile
– Größerer Codeumfang
– Implementierung ist nach außen hin sichtbar
– Bei impliziten (also nicht externen) inline-Funktionen
wird die Schnittstellenbeschreibung durch eingestreuten
Implementierungs-Code schwerer lesbar
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
(Externe) inline-Memberfunktionen
– Ort der Deklaration
• Sollten immer in der Schnittstellendatei deklariert und
definiert werden
• Werden inline-Deklarationen in die Implementierungs-
datei verlagert, so sind sie nur dort bekannt und damit
nur dort wirksam!
Anwendung kennt nur die Schnittstelle durch das Einbin-
den der Informationsdatei, die keinen Hinweis auf inline
enthält
Funktion wird nicht eingefügt sondern aufgerufen
Der Linker kann diesen Aufruf jedoch nicht herstellen, da
für eine inline-Funktion keine Referenz vorliegen kann
Fehlermeldung durch den Linker!!
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Der this-Zeiger
– Jeder Elementfunktion wird implizit als erstes
Argument ein Zeiger auf das Klassenobjekt
übergeben
• Über diesen Verweis wird (ebenfalls implizit) auf die
Komponenten des Objekts zugegriffen
• Beispiel
CRatio eineZahl;
... wird implizit
eineZahl.Eingabe(); Eingabe(&eineZahl);
ersetzt durch
– Der „interne“ Prototyp lautet void Eingabe(CRatio * const this);
Der this-Zeiger
– Jede Elementfunktion darf den this-Zeiger
auch explizit verwenden
– Einsatz von this, wenn
• eine Elementfunktion
– das aktuelle Objekt (Wert),
– eine Referenz (return *this;) oder
– einen Zeiger (return this;) auf das aktuelle Objekt
zurückgeben soll oder
• die Elementfunktion eine weitere Funktion aufrufen soll,
an die das aktuelle Objekt oder ein Zeiger darauf überge-
ben werden muss oder
• Komponenten des Klassenobjekts durch lokale Größen
verdeckt sind (this->Komponente)
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
#include <iostream>
#include "cratio .h"
{
return(help);
CRatio help;
return(*this);
cratio .cpp
6
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
bruch1.Init(1, 2);
bruch2.Init(1, 2);
bruch3.Init();
bruch3 = bruch1.PlusGleich(bruch2);
cout << "Bruch3 = Bruch1.PlusGleich(Bruch2) = " << endl;
bruch3.Ausgabe();
bruch4 = bruch1.Minus(bruch2);
cout << "\n\nBruch4 = bruch1.Minus(Bruch2) = " << endl;
bruch4.Ausgabe();
bruch4 = bruch1.PlusGleich(bruch2).Minus(bruch3);
cout<<"\n\nBruch4 = Bruch1.PlusGleich(Bruch2).Minus(Bruch3)"<<endl;
bruch4.Ausgabe();
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Konstante Memberfunktionen
– Spezifikation: Zusatz const hinter dem Funk-
tionskopf einer Elementfunktion
• Objektkomponenten class CRatio
{
können innerhalb der public:
Funktion nicht verän- void Init() {zae = 0; nen = 1;}
dert werden void Ausgabe() const; //Deklaration
• Nicht const-spezifi- ...
Konstante Memberfunktionen
– Anmerkungen
• Der Zusatz const ändert den Typ des implizit
übergebenen this-Zeigers auf
const KlassenName * const this
– this ist jetzt ein konstanter Zeiger auf ein konstantes
Objekt!
• Ausnahme
– Werden Datenelemente explizit mit mutable gekenn-
zeichnet, dann dürfen sie von const-Elementfunktionen
geändert werden
...
private:
mutable int zae; // zae koennte in Ausgabe()
// geaendert werden,
int nen; // nen nicht
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Konstante Memberfunktionen
– Anmerkungen
• Für const - Klassenobjekte können nur const-Mem-
berfunktionen aufgerufen werden!
– Für nicht const-Klassenobjekte können beide Arten von
Memberfunktionen aufgerufen werden
– Beispiel
const CRatio zahl1;
CRatio zahl2;
zahl1.Eingabe(); // nicht moeglich !!
zahl1.Ausgabe(); // OK
zahl2.Ausgabe(); // OK
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Statische Datenelemente
– Deklaration und Definition
• Ein statisches Datenelement wird mit static innerhalb
der Klasse deklariert
• Es muss außerhalb der Klassendeklaration einmal
definiert und ggf. initialisiert werden
– Fehlt diese Initialisierung, so erfolgt automatisch eine Ini-
tialisierung mit 0 vom entsprechenden Typ
– Anwendungen
• Speicherung von Statusinformationen, die alle Objekte
betreffen
• Überwachung bzw. Begrenzung der Anzahl von Instan-
zen
• Wurzel-Zeiger für Listen
• ...
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
Statische Datenelemente
– Anmerkungen
• Der Zugriff ohne Objekt über die Klassenbezeichnung ist
für statische public-Komponenten möglich
• Bei der Initialisierung spielt das Zugriffsrecht (private,
protected, public) keine Rolle
• Die Initialisierung darf nur ein einziges Mal stattfinden
– Trennung in Informationsdatei und Implementierungsdatei
notwendig
– Erst ab C++17 ist eine Initialisierung bei der Klassendefini-
tion durch Zusatz von inline möglich, so dass keine Ini-
tialisierung in einer Implementierungsdatei notwendig ist
• static-Komponenten werden durch sizeof() und
new bei der Ermittlung des Speicherplatzes für ein Klas-
senobjekt nicht berücksichtigt
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
Statische Memberfunktionen
– Allgemeine Anmerkung
• Grundsätzlich existiert von jeder Elementfunktion (sta-
tisch oder nicht) nur ein Exemplar pro Klasse
– Eigenschaften statischer Elementfunktionen
• Sie erhalten keinen this-Pointer auf „normale“ Klassen-
objekte
Keine Bindung an ein individuelles Klassenobjekt
Kein Zugriff auf individuelle Objektkomponenten möglich
• Zugriff auf statische Klassenattribute (auch auf private)
• Aufruf von öffentlichen static-Elementfunktionen ohne
Objektbezug über die Klassenbezeichnung möglich
– Verbesserung des vorhergehenden Beispiels
• Information-Hiding durch eine statische Elementfunktion
für den Zugriff auf art
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
private:
... cratio8.cpp
// Datenelemente // Definition der statischen Elementfunktion
int zae, nen; void CRatio::SetzeArt(Anzeige
// Zaehler, Nenner Typ)
static Anzeige art; {
}; art = Typ;
... // nen = 1; // waere nicht moeglich !
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
friend-Funktionen - Beispiel
class A
{
public:
void KontrolleIstGut() {a = 10; b = 20;}
friend void VertrauenIstBesser(A& rObjekt); // keine Memberfkt.
int a;
private: // externe Funktionen:
int b; void VertrauenIstBesser(A& rObjekt)
}; {
rObjekt.a = 0; // OK, da public
rObjekt.b = 1; // Zugriff auf private-Komponente !
}
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik
KOPIE FÜR 6DF1.OTH-AW.DE (MOHAMMAD FADAVI), ERSTELLT: 12.04.2022
– Weitere Anmerkungen
• friend-Beziehungen zwischen Klassen können auch
wechselseitig sein
• Vorsicht! Diese Form der Öffnung nach außen hin ver-
letzt das Prinzip des Information Hiding stark
OTH Amberg-Weiden
Programmierung II / Einführung in C++ Josef Pösl
Informatik