16
Peter Sobe 1 Ü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 des Typkonzepts von C++ 4. Ziele der Objektorientierung 5. Objekt und Klasse, Elementfunktionen (Methoden) 6. Konstruktoren, Copy-Konstruktor, Destruktor und Wertzuweisung 7. Operatoren, Überladen von Operatoren 8. Elementobjekte und Elementobjektkonstruktoren 9. Klassenhierarchien und Vererbung 10. Polymorphie 11. Abstrakte Klassen Peter Sobe 2 1. Einführung C++ / Entwicklung / Sprachfamilie Die folgenden Folien (inhaltlich von Helmke / Isernhagen übernommen) zeigen: die Charakteristik von C++ im Vergleich zu C die Nachteile die Vorteile die Entwicklungsstufen der Standards von C/C++ die Sprachfamilie

1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 1

Überblick

1. Einführung C++ / Entwicklung/ Sprachfamilie2. 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 des Typkonzepts von C++ 4. Ziele der Objektorientierung5. Objekt und Klasse, Elementfunktionen (Methoden)6. Konstruktoren, Copy-Konstruktor, Destruktor und Wertzuweisung7. Operatoren, Überladen von Operatoren8. Elementobjekte und Elementobjektkonstruktoren9. Klassenhierarchien und Vererbung10. Polymorphie11. Abstrakte Klassen

Peter Sobe 2

1. Einführung C++ / Entwicklung / Sprachfamilie

Die folgenden Folien (inhaltlich von Helmke / Isernhagen übernommen) zeigen:

die Charakteristik von C++ im Vergleich zu C

die Nachteile

die Vorteile

die Entwicklungsstufen der Standards von C/C++

die Sprachfamilie

Page 2: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 3

C++ Fortschritt oder Chaos?

Sowohl als auch!

C++ bietet mehr Leistungsumfang gegenüber C Objektorientierung Abstrakte Datentypen Generische Programmierung

Einiges könnte man aber auch chaotisch nennen: Adressarithmetik Umgang mit Pointern

Klare Nachteile von C++: nicht durchweg systematischer Aufbau, geschuldet der

Abwärtskompatibilität nicht konsequent statisch typisiert zum Teil kryptische Notation

Peter Sobe 4

Vorteile von C++

Argumente für C/C++: Standardisiert und weit verbreitet Verschiedene Abstraktionsebenen und Programmierparadigmen Speicher- und Laufzeiteffizient

C++ ist eine bessere Sprache für große Softwaresysteme:Man kann ein kleines Programm (ca. 1000 Zeilen) zum Laufen bringen selbst wenn man jeden Programmierstil außer acht lässt. Für größere Programme gilt das nicht mehr!

Weshalb? Wenn die Struktur eines 100.000 Zeilen-Programms schlecht ist,

führt fast jede Fehlerbereinigung zu einem neuen Fehler. C++ wurde so entworfen, dass auch größere Programme vernünftig

strukturiert werden können und eine einzelne Person ein weitaus größere Menge an Programmcode überblicken kann.

Zusätzlich sollte eine einzelne Programmzeile in C++ weitaus ausdrucksstärker sein als eine in C oder Pascal.

Page 3: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 5

Entwicklungsstufen von C zu C++

K&R C

ANSI/ISO-C99

ANSI/ISO-C89

ANSI/ISO-C++

Peter Sobe 6

Die Großfamilie der C-Sprachen

K&R – C (1972, Kerningham-/Ritchie, Entwickler von C) ANSI/ISO-C89 ANSI/ISO-C99 C++ (1985, Bjarne Stroustrup) ANSI/ISO-C++ 98 ANSI/ISO-C++ 0x

Java – C++-ähnliche Programmiersprache, SUN 1995 C# – C++-ähnlich, Microsoft 2001

Page 4: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 7

Überblick

1. Einführung C++ / Entwicklung/ Sprachfamilie2. 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 des Typkonzepts von C++ 4. Ziele der Objektorientierung5. Objekt und Klasse, Elementfunktionen (Methoden)6. Konstruktoren, Copy-Konstruktor, Destruktor und Wertzuweisung7. Operatoren, Überladen von Operatoren8. Elementobjekte und Elementobjektkonstruktoren9. Klassenhierarchien und Vererbung10. Polymorphie11. Abstrakte Klassen

Peter Sobe 8

2. Überblick zu ausgewählten Konzepten von C++ (nicht objektorientierte Erweiterungen)

2.1 Das Ein-/Ausgabekonzept von C++ - Unterschiede gegenüber C- Ausgabe- Eingabe- Formatierung

2.2 Referenzen in C++- Zeigerkonzept in C und Referenzen - Gemeinsamkeiten / Unterschiede

2.3 Speicherallokation in C++

Page 5: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 9

2.1 Das Ein-/Ausgabekonzept von C++

Wir haben das E/A-Konzept von C kennen gelernt. Die Definitionsdatei <stdio.h> stellt alle notwendigen Moduln für eine formatgebundene E/A zur Verfügung.

Dieses Konzept können Sie in C++ einschränkungslos auch verwenden.

In C++ steht über die Definitionsdatei <iostream.h> ein weiteres E/A-Konzept zur Verfügung. Dieses Konzept realisiert eine Umwandlung zwischen einer Zeichenkettendarstellung und der internen Darstellung gemäß den bekannten Standardtypen (int , float, ...), wobei Formate nicht angegeben werden müssen.

Peter Sobe 10

Das Ein-/Ausgabekonzept von C++

Besonders wichtig ist die Erweiterbarkeit der E/A für vom Nutzer neu definierte Typen (Klassen). Die Realisierung dieser E/A ist objektorientiert angelegt (Klasse basic_ ios). Analog zu den C E/A-Dateien existieren in C++ E/A-Objekte:

C C++ Objekt C++ Klasse

stdin cin basic_ istream stdout cout basic_ ostream stderr cerr basic_ostream

Die beiden folgenden Folien von Helmke / Isernhagen stellen übersichtlich die beiden E/A-Konzepte von C und C++ gegenüber.

Page 6: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

R.Großmann 11

R.Großmann 12

Page 7: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 13

Das Ein-/Ausgabekonzept von C++ Nutzung des cout- und cin-Objektes

Der folgende Programmausschnitt zeigt die typische Nutzung der nicht-formatgebundenen E/A in C++:

#include <iostream.h>void main(){ int i;float f=7.5; char c[20]= “ i+f ist gleich “;cout<< “\nProgrammstart “;cout<< “\nEingabe i= “;cin>>i; cout<<c<<i+f<< “\n“;

}

Bemerkenswert ist das Fehlen von Formatierungen (es wird mit Standards gearbeitet) und die Nutzung von Operatoren >> bzw. << für die Ein- bzw. Ausgabe.

Peter Sobe 14

Das Ein-/Ausgabekonzept von C++ Nutzung der <<- bzw. >>-Operatoren

Die <<- bzw >>-Operatoren wurden bewusst als Infix-Operatoren gewählt ( op1 << op2) mit der Bedeutung:

cout<< operand - wandle den operand in eine Zeichen-kette um und gib sie in das cout-Objekt aus

cin>> operand - lies eine Zeichenkette aus dem cin-Objekt und wandle sie typgemäß in die Interndar-stellung von operand um

Damit ist es möglich, diesen Operator für neu definierte Typen, z.B. complex zu überladen und in gleicher Weise komplexe Werte auszugeben:

... complex c; ... cout<<c;

Page 8: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 15

Das Ein-/Ausgabekonzept von C++ Besonderheiten der Eingabe

Der „>>“-Operator nimmt nur solche Zeichen entgegen, die für den jeweiligen Typ zugelassen sind.

C-Trennzeichen:Enter, Leerzeichen, \n, \t, \r , \f und EOF(Ctrl - C) beenden eine Eingabe von cin.Damit wird die Eingabe von Zeichen und Zeichenketten ggf. problematisch.

... char c; ... cin>>c;

Liest nächstes Zeichen ein, das von einem Trennzeichen verschieden ist.

Peter Sobe 16

Das Ein-/Ausgabekonzept von C++ Besonderheiten der Eingabe – get-Funktion

Um auch Trennzeichen wie Enter, Leerzeichen usw. mit zu lesen, muss die Funktion get() verwendet werden. Sie liest bis EOF(Ctrl -C), was allerdings auch das Programm beendet. (vgl. cin2.cpp)

Wird get() mit Parametern aufgerufen, kann eine sichere Eingabe erfolgen:

... char c[100]; ... cin.get(c,99,‘\n‘);

Es werden alle Zeichen bis zum Zeilenende gelesen, aber max. 99 Zeichen weiter gegeben.

Ein weiteres Beispiel: char i[10]; // 10.Zeichen ist Stringabschlusscout<< "\nProgrammstart \n";cin.get(i,10,'\n'); cout<<i;cout<<"\nEnde";

Page 9: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 17

Das Ein-/Ausgabekonzept von C++ formatgebundene Ein- und Ausgabe

Formatgebundene Ausgaben (teilweise auch für Eingaben möglich) können über

ios-Funktionen und Setzen von Flags oder

Nutzung von Manipulatoren (<iomanip.h>) vorgenommen werden.

Wichtige ios-Funktionen:

width(b) Breite der Ausgabe, b Zeichenfill(‘#‘) Füllzeichen precision(b) b gültige Ziffern werden ausgegeben

Peter Sobe 18

Das Ein-/Ausgabekonzept von C++ ios-Flags

Mit der ios-Funktion:

setf(ios:: flag1 | ios:: flag2 ) auch nur 1 Parametermöglich

können durch verschiedene Flagkombinationen z.B. Feldausrichtung (links,rechts), Ausgabeformen ganzer Zahlen (Oktal,Hexadezimal) oder Gleitkommazahlen (Dezimal oder mit Exponent) eingerichtet werden.

Mit unsetf( ... ) lassen sich Einstellungen rücksetzen.

Page 10: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 19

Das Ein-/Ausgabekonzept von C++ Manipulatoren

Anstelle von ios-Funktionen lassen sich zum Teil bequemerdie gleichen Wirkungen mit sogenannten Manipulatoren erreichen.

Manipulatoren können direkt mit << in den Ausgabestrom geschrieben werden, z.B.

.....cout<<setw(20)<<scientific<<f;

In den Beispielprogrammen kann die Wirkung der ios-Flags und der Manipulatoren studiert werden.

Peter Sobe 20

Beispiele ios und Manipulatoren (1)

#include <iostream.h>#include <iomanip.h>#include <stdio.h>

void main() {int i;

// 1) Dezimal/Hexadezimal/Oktal// ============================cout.setf(ios::showbase | ios::uppercase | ios::dec);for (i=0; i<=15; i++) { cout.width(4); cout << i; }cout << endl;cout.unsetf(ios::dec); cout.setf(ios::hex);for (i=0; i<=15; i++) { cout.width(4); cout << i; }cout << endl;cout.unsetf(ios::hex); cout.setf(ios::oct);for (i=0; i<=15; i++) { cout.width(4); cout << i; }cout << endl << endl;…

Page 11: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 21

Beispiele ios und Manipulatoren (2)

// 2) Ausrichtung und Fuellzeichen// ===============================cout.unsetf(ios::oct); cout.setf(ios::dec);cout.setf(ios::left); cout.fill('.'); cout.width(10);cout << 2002 << endl; cout.setf(ios.right); cout.fill('.'); cout.width(10);cout << 2003 << endl << endl;

// 3) Ausgabe von Gleitkommazahlen// ===============================double x = 12.34, y = 5678.9123456, z = 1e5;printf("Festpunkt : (%12.2lf,%12.2lf,%12.2lf)\n", x, y, z);

cout.fill(' '); cout.setf(ios::fixed); cout.precision(2);cout << "Festpunkt : (";cout.width(12); cout << x << ',';cout.width(12); cout << y << ',';cout.width(12); cout << z << ')' << endl;

Peter Sobe 22

Beispiele ios und Manipulatoren (3)

printf("Gleitpunkt : (%12.2le,%12.2le,%12.2le)\n", x, y, z);

cout.unsetf(ios::floatfield | ios::uppercase);cout.fill(' '); cout.setf(ios::scientific); cout.precision(2);cout << "Gleitpunkt : (";cout.width(12); cout << x << ',';cout.width(12); cout << y << ',';cout.width(12); cout << z << ')' << endl;

}

Page 12: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 23

2.2 Referenzen in C++

Eine Referenz ist ein alternativer Name (Alias) für ein Objekt.

Die Hauptanwendungen in C++ sind:

die Angabe von Argumenten (Parameterkonzept) und Rückkehrwerten bei Funktionen und

beim Überladen von Operatoren in Klassen

In C++ ist die Schreibweise X& und bedeutet Referenz auf Typ X.

Beispiel:... int i=1; int& r =i; // r ist ein zweiter Name für i

Peter Sobe 24

Initialisieren und Ändern von Referenzvariablen in C++

Eine Referenz muss stets initialisiert werden. Eine Referenz stellt so etwas wie einen konstanten Zeiger dar.

Beispiel:int i=2; int& ri=i; // ri ist Referenz auf i ri++; // es wird der Wert von i auf 3 erhöht !

ri=55; // auch das geht, i ist danach 55

const int& rc=2; // rc ist Referenz auf eine Konstante,// nur mit const möglich

ri = rc; // danach bekommt rc und auch i den Wert 2 Falsch:

rc = 42, rc++; // falsch, da rc eine Konstante // referenziert

Page 13: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe25

Referenzen bei der Parametervermittlung in C++

Aus C sind die beiden Parametervermittlungsarten:

call by value und

call by reference

bekannt. Call by reference wird dabei über Zeiger realisiert.

Das ist auch in C++ so möglich. Eine weitere Form des call byreference ist aber die Verwendung von Referenzen anstelle von Zeigern (vgl. Demo-Programme).

Peter Sobe 26

void main(){

int n1=2, n2, n3; int& r=n2;n2=n3=0;plus_minus(n1, n2, n3);cout <<"\n1="<<n1<<" n2="<<n2<<" n3="<<n3<<endl;//mit Referenz r das gleiche Resultatn2=n3=0;plus_minus(n1, r, n3); cout <<"\n1="<<n1<<" n2="<<n2<<" n3="<<n3<<endl;

}void plus_minus(int a, int& b, int& c) {

b=a+1; c=b-1;}

Beispielcode für Referenzen

Page 14: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 27

2.3 Heap-Allokation in C++

Durch Allokation wird dynamisch zur Programmlaufzeit Speicher in einem speziellen Teil des Arbeitsspeichers, der Halde (Heap) reserviert. In C haben Sie die Funktionen malloc(...), calloc(...),... und die Freigabefunktion free(...) kennengelernt.

In C++ stehen dafür die Operatoren new und delete zur Verfügung.

Die folgenden Folien (inhaltlich von Helmke und Isernhagen übernommen) geben einen kurzen Einblick in das Wesen der Werte- und Zeigersemantik in C und C++ sowie die Syntax und Semantik der Operatoren new und delete !

Peter Sobe 28

Zeigersemantik in C und C++

In C/C++ hat der Programmierer zwei verschiedene Möglichkeiten, auf Daten zuzugreifen

Er kann direkt mit den Werten oder Variablen arbeiten (Wertesemantik)

Er kann indirekt über einen Zeiger auf den Wert zugreifen (Zeigersemantik)

Bei der Wertesemantik werden die Daten vom Laufzeitsystem auf den Programmstack verwaltet

Bei der Zeigersemantik muss der Programmiere explizit auf dem Heap Speicherplatz reservieren und später auch wieder freigeben

Page 15: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 29

Zeigersemantik in C und C++

Wertesemantikin C/C++

int a,b;a = 123;b = a;…

Zeigersemantik inC

int *a,*b;a = (int*)malloc(sizeof(int));b = (int*)malloc(sizeof(int));

*a = 123;*b = *a;

free(a);free(b);

Zeigersemantik in C++

int *a, *b;a = new int;b = new int;

*a = 123;*b = *a;

delete a;delete b;

Peter Sobe 30

Operator „new“ (1)

Mit dem Operator new wird Speicher im Heap-Speicher angefordert und der Zeigervariablen zugewiesen:

Beispiele:

int *iptr = new int;

int *kptr = new int(64);

int *jptr = new int[30]; // ein Speicherbereich für 30 int Werte // wird angefordert

Keine Initialisierung für Standardtypen

Wenn eine C++ Speicheranforderung nicht erfüllt werden kann, wird ein Ausnahmeobjekt vom Typ bad_alloc erzeugt, auf das dann im Rahmen der Ausnahmebehandlung reagiert werden kann.

Page 16: 1u2 Einfuehr Erweiterung.ppt [Kompatibilitätsmodus]sobe/Vorjahre/Vo_Info2_Jg10/1u2_Einfuehr... · Peter Sobe 9 2.1 Das Ein-/Ausgabekonzept von C++ Wir haben das E/A-Konzept von C

Peter Sobe 31

Operator „new“ (2)

In C++ gibt es auch die alternative Möglichkeit, die konventionelle Fehlerbehandlung wie in C zu benutzen

#include <new>

using namespace std;

int vector = new (nothrow) int[20];

If (!vector) {

// kein Speicherplatz mehr verfügbar

}

else {

// alles in Ordnung!

}

Peter Sobe 32

Operator „delete“

Wird der über new angeforderte Speicherbereich nicht mehr verwendet, so muss er per delete explizit wieder freigegeben werden.

delete kann nur in Verbindung mit new eingesetzt werden.

delete auf einen Null-Pointer hat keine Auswirkungen.

int *pint = new int;int *pintfeld = new int[64];…delete pint;delete [] pintfeld;

int i, *pint = new int;int *pint2 = &i;…delete pint;delete pint2; // Fehler, da nicht per new erzeugt