Nichtobjektorientierte Erweiterungen von C++
1. Diverse "Kleinigkeiten"
1.1 Kommentare
2 Möglichkeiten:
wie in C ("/* ... */"): besser geeignet für mehrzeilige Kommentare
mittels "// ...": geht bis ans Zeilenende, für kurze Kommentare
1.2 Variablen-Vereinbarungen
Variablen-Definitionen sind auch mitten im "Anweisungs-Teil" eines Blockes erlaubt.
Bsp.:
{ // Blockbeginn
int i;
i = 15; // 1. Anweisung, "Anweisungsteil" beginnt
...
int j; // wäre in C ein Syntax-Fehler!
...
} // Blockende
"sparsam" verwenden!
Häufiger Anwendungsfall:
for (int i = 0; i < max; ++i) { ... }
Vorsicht: i gehört dem umschließenden Block!
Hinweis: auch in C gilt: Variablen-Vereinbarungen in jedem Block möglich, allerdings nur am Anfang.
1.3 Struktur-Vereinbarungen
"Struktur-Namen" sind in C++ "richtige" Typen.
Bsp.:
struct PERSON {
char Name [30];
int Alter;
...
};
...
PERSON mitarbeiter; // C-Version: struct PERSON mitarbeiter;
1.4 Prototypen
zwingend:
wenn Funktion aufgerufen wird, bevor sie definiert wurde
beim Aufruf von "externen" Funktionen (z.B. strcmp, ... --> string.h inkludieren!)
Hinweis: die Parameter-Namen beim Prototyp sind nur "Kommentar", können weggelassen werden
2. Standard-Ein/Ausgabe mittel cin/cout
eigentlich schon "objekt-orientiert", für einfache Aufgaben jedoch auch "rezeptmäßig" einsetzbar
Beispiel:
C++
#include ... long x; cout << "Wert für x? "; cin >> x; cout << "x*x = " << x*x << endl; ... |
C
#include ... long x; printf ("Wert für x? "); scanf ("%ld", &x); printf ("x*x = &ld\n", x*x); ... |
Operator "<<" ersetzt printf, Operator ">>" ersetzt scanf
cin / cout entsprechen stdin / stdout [printf (...) entspricht ja fprintf (stdout, ...)]
"endl" = "Manipulator"
Vorteile:
Typen werden automatisch richtig berücksichtigt, kein Formatstrings erforderlich
kein &-Zeichen bei der Eingabe erforderlich
Konzept auf eigene Typen erweiterbar (z.B. cin >> mitarbeiter;)
Nachteile:
formatierte Ausgaben relativ aufwendig, iostream-Bibliothek wird kompliziert
3. Überladen von Funktionen
mehrere Funktionen können den gleichen Namen haben
sie müssen sich jedoch durch ihre Parameter unterscheiden (Anzahl und/oder Typ)
Beispiel:
C++
void ausgabe (int wert) { cout << "Wert: " << wert << endl; } void ausgabe (double wert) { cout << "Wert: " << wert << endl; } void main () { &nbsx;ausgabe (2017); ausgabe (3.141592); } |
C
void ausgabeInt (int wert) { printf ("Wert: %d\n", wert); } void ausgabeDbl (double wert) { printf ("Wert: %f\n", wert); } void main () { ausgabeInt (2017); ausgabeDbl (3.141592); } |
Compiler unterscheidet selbständig beim Aufruf der Funktion aufgrund der aktuellen Parameter, welche Funktion aufgerufen wird.
Vorsicht: Programmierer muss mehr nachdenken, welche Funktion wirklich aufgerufen wird!
Funktionen sollten (unbedingt!) logisch das gleiche tun.
Hinweis: "<<" und ">>" sind überladene Funktionen, die mehrfach (für alle Standard-Typen) vorliegen!
4. Default-Parameter
treten in Kraft, wenn beim Aufruf der Funktion Parameter weggelassen werden
Beispiel:
void fu (int p1, int p2 = 20, int p3 = 30)
{
cout << "p1 = " << p1 << ", p2 = " << p2 << ", p3 = " << p3 << endl;
{
void main ()
{
fu (1, 2, 3); // p1 = 1, p2 = 2, p3 = 3
fu (1, 2); // p1 = 1, p2 = 2, p3 = 30
fu (1); // p1 = 1, p2 = 20, p3 = 30
// fu (); führt zu Compiler-Fehlermeldung
// fu (1, , 3); führt zu Compiler-Fehlermeldung
}
Parameter können von rechts nach links weggelassen werden.
Wenn ein Prototyp angegeben wird, dann die Defaultwerte nur beim Prototyp angeben.
Vorsicht: Gefahr von Mehrdeutigkeiten vor allem im Zusammenhang mit Funktions-Überladungen.
Bsp.:
void fu (int p1, int p2 = 20, int p3 = 30) { ... }
void fu (int i, int j) { ... }
void main ()
{
fu (10, 20); // führt zu Compiler-Fehlermeldung
}
5. Referenzen
mehrere Namen für eine Variable
Bsp.:
int i;
int& ri = i;
i = 5;
cout << "i=" << i << ", ri=" << ri << endl; // i = 5, ri = 5
ri = 10;
cout << "i=" << i << ", ri=" << ri << endl; // i = 10, ri = 10
Referenz muss sofort bei der Definition initialisiert werden (mit dem Namen einer anderen Variablen)
danach wird bei jeder Verwendung der Referenz-Variable immer auf den Variablen-Inhalt zugegriffen
sehr ähnlich Zeigern, Unterschied:
Verweis auf anderes Objekt wird sofort beim Anlegen (nur einmal!) festgelegt, danach ist ein Ändern des Verweises nicht mehr möglich.
außer bei der Definition wird durch den Namen der Referenz-Variablen immer der Inhalt angesprochen, nicht die Adresse -> es wird immer automatisch dereferenziert.
Wichtigste Anwendung: "Var"-Parameter (= "Referenz"-Parameter)
Beispiel:
C++
void tausche (int& a, int& b) { int h; h = a; a = b; b = h; ... } void main () { int v1 = 10, v2 = 20; tausche (v1, v2); ... } |
C
void tausche (int *a, int *b) { int h; h = *a; *a = *b; *b = h; ... } void main () { int v1 = 10, v2 = 20; tausche (&v1, &v2); ... } |
Referenzen können auch als Funktionsergebnis auftretenn
z.B.: suche ("Karl") = 25;
Vorsicht: keine Referenzen auf lokale Variable zurückliefern!
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen