Funktionen in C++ Funktionen und Parameter Wie in Java: - - PowerPoint PPT Presentation
Funktionen in C++ Funktionen und Parameter Wie in Java: - - PowerPoint PPT Presentation
Funktionen in C++ Funktionen und Parameter Wie in Java: Parameter sind lokale Variablen Argumente werden bei Aufruf zugewiesen Extras: Zeiger-Parameter fr alle Typen: als Rckgabewerte um groe Kopien zu
(c) schmiedecke 09 Info2-C++-Funktionen 2
Funktionen und Parameter
- Wie in Java:
– Parameter sind lokale Variablen – Argumente werden bei Aufruf zugewiesen
- Extras:
– Zeiger-Parameter für alle Typen:
- als Rückgabewerte
- um große Kopien zu verhindern
– Referenz-Parameter
- machen den Zeiger-Mechanismus implizit
– Default-Parameter
- vorbesetzte Parameter machen Argumente optional
– Kommandozeilenparameter (optional)
(c) schmiedecke 09 Info2-C++-Funktionen 3
Wdh: Zeiger-Parameter
- Zeiger-Parameter
– sind Ausgabe-Parameter – ersparen das Kopieren großer Werte void translatePoint(int *x, int *y) {
*x += deltaX; *y += deltaY;
} struct Point { int x; int y }; Point A = { 12, 45 }; cout << A.x << " " << A.y << endl; translatePoint (&(A.x), &(A.y); cout << A.x << " " << A.y << endl;
(c) schmiedecke 09 Info2-C++-Funktionen 4
Wdh: Referenz-Parameter
- Referenz-Parameter machen die Zeigeroperationen implizit:
Parameter ist Alias des Arguments
- Deklaration als Referenz-Parameter
- Aufruf mit einfacher Variable als Argument
- Die Referenzierung (Adressermittlung) erfolgt implizit
void translatePoint(Point &alias) { alias.x += deltaX; alias.y += deltaY; } Point A = { 12, 45 }; cout << A.x << " " << A.y << endl; translatePoint (A); cout << A.x << " " << A.y << endl
(c) schmiedecke 09 Info2-C++-Funktionen 5
void-Zeiger
- Untypisierte Zeiger
void *anypointer; int x = 4; char text[100]; anypointer = &x; anypointer = &text;
- Ermöglichen "typenoffene" Arrays und Funktionen:
void *storage[1000]; void store (void *anydata) { storage[index++] = anydata; } // call as store(&mydata);
- Jede Dereferenzierung erfordert "Casting"
*(char*)storage[2] = 'c'; int x = *(int *)storage[5];
(c) schmiedecke 09 Info2-C++-Funktionen 6
Rätsel: Was tut diese Funktion???
void memz (void *ptr, int length) { for(; length>0; length--) *(((char *)ptr) + length) = 0; }
(c) schmiedecke 09 Info2-C++-Funktionen 7
Typische Verwendung: Knoteninhalt einer verketteten Liste
struct Node { void *content; Node *succ; Node *pred; } Node *node; ... *(double *)(node->succ->content) = 12.2;
(c) schmiedecke 09 Info2-C++-Funktionen 8
Default-Parameter
C++ erlaubt die Vorbesetzung von Parametern Bei Aufruf können Argumente weggelassen werden - es werden stattdessen die vorbesetzten Werte verwendet
char *parse (char *text, char sep = ',', char finish = '/'); char csv[100]; cin >> csv; parse(csv, ' ', '|'); parse (csv,'+'); // parse(csv, '+', '/'); parse(csv); // parse(csv, ',', '/');
(c) schmiedecke 09 Info2-C++-Funktionen 9
Default-Parameter - Regeln
Default-Belegung darf nur 1x deklariert werden Default-Parameter rechts von allen nicht vorbesetzten Parameter-Identifikation von links nach rechts, typtreu
(c) schmiedecke 09 Info2-C++-Funktionen 10
Kommandozeilen-Parameter
- main hat eine zweite Signatur:
int main(int argc, char *argv[]);
- argc Anzahl der Argumente – mind. 1:
der Programmname gilt als 1. Parameter!
- argv Array von Strings
beim Aufruf durch Leerzeichen getrennt
- Konvertierungsfunktionen in <cstdlib>
– atoi String nach int – atol String nach long int – atof String nach double
(c) schmiedecke 09 Info2-C++-Funktionen 11
Scope
- Wie in Java:
– Deklarationen innerhalb eines Blockes sind lokal: Lebensdauer: Blockausführung Sichtbarkeit: innerhalb des umgebenden Bloxks
- Extras:
– Es gibt einen globalen Gültigkeitsbereich: Deklaration außerhalb von Böcken. Lebensdauer = unbeschränkt (Programmausführung) Sichtbarkeit = unbeschränkt – Namespace stellt keine Sichtbarkeitsschranke dar. – static Lebensdauer lokaler Variablen kann unbeschränkt gesetzt werden Sichtbarkeit bleibt lokal!
(c) schmiedecke 09 Info2-C++-Funktionen 12
Rückgabe von Zeigern
- Lebensdauer-Alarm!
int *liesZahl () { int eingabe; cin >> eingabe; return &eingabe; } int *erzeugeListe() { int liste[10] = {999}; return liste; } char *liesText() { char eingabe[100]; cin >> eingabe; return eingabe; } int *liesZahl () { int *eingabe = new int; cin >> *eingabe; return eingabe; } int *erzeugeListe() { int liste[] = new int[10]; return liste; } char *liesText() { char eingabe[] = new char[100]; cin >> eingabe; return eingabe; }
(c) schmiedecke 09 Info2-C++-Funktionen 13
Rückgabe von Referenzen
- Funktionen können Referenzen zurückgeben
- Referenzen sind unbenannte Variablen:
– können auf der linken Seite von Zuweisungen stehen – werden automatisch dereferenziert, wenn der Wert benötigt wird (in Ausdrücken)
- Lebensdauer-Alarm wie bei Rückgabe-Zeigern!
int ids[] = { 10, 11, 12, 13,14 } int &access(int index) { return ids[index]; } int main() { access(3) = 33; access(4) = 44; }
(c) schmiedecke 09 Info2-C++-Funktionen 14
Deklaration und Definition
- In C++ gilt streng:
Deklaration vor Benutzung
- Unterscheidung
Deklaration – Definition
Typvereinbarung - Implementierung
- Deklaration darf beliebig oft wiederholt werden!
Definition muss eindeutig sein (einmalig im Programm)
- Deklaration einer Funktion:
Prototyp: int function(int, double*);
- Deklaration einer globalen Variablen:
external char* username;
(c) schmiedecke 09 Info2-C++-Funktionen 15
Header- und Implementierungsdateien
(Programmierstil, nicht Spracheigenschaft)
- Menge der Deklarationen eines Moduls:
Modul-Spezifikation Modul-Gliederung in zwei Dateien:
– Zusammenfassung der Deklarationen zur Header-Datei Dateiendung .h – Zusammenfassung der Definitionen zur Implementierungs-Datei (aka "Source-Datei") Dateiendung .cpp (oder .c)
- Der Compiler benötigt zur Übersetzung nur die Header-Dateien der
benutzten Moduln Nur die Header-Dateien werden eingebunden ("inkludiert").
(c) schmiedecke 09 Info2-C++-Funktionen 16
Getrennte Kompilation
- Main-Modul:
– Modul mit main-Funktion (nur 1 pro Programm erlaubt!) – wird übersetzt zur ausführbaren Datei ("Exe") – weitere Dateien können nachgezogen werden
c++ main.c main.h # liefert a.out c++ -o main.exe main.c main.h # liefert main.exe
- Anderes Modul:
– kann getrennt übersetz werden – Ergebnis: Objekt-datei (.o) c++ -c modul1.c modul1.h modul2.h# liefert modul1.o
(c) schmiedecke 09 Info2-C++-Funktionen 17
Funktionszeiger
- In C++ kann ein Zeiger nicht nur auf Daten, sondern auch auf eine
Funktion verweisen
- der Typ ist "Zeiger auf Signatur"
- d.h. einem Zeiger können nur Funktionen gleicher Signatur
zugewiesen werden int (*function)(int, char, char[]); // Variable "function" vom Typ // Zeiger auf int-Funktion // mit (int, char, char[])-Parametern
(c) schmiedecke 09 Info2-C++-Funktionen 18
Verwendung von Funktionszeigern
- Funktionszeiger sind die C-Option für Funktionsvariation und
Callback
- OO ist Polymorphie das Mittel der Wahl
- Trotzdem ist die "kleine Lösung mit Funktionszeigern manchmal
eleganter und effizienter.
- Beispiel:
- "Generischer" Sortieralgorithmus mit void*-Parametern
- Vergleichsfunktion für Elemente wird als Funktionszeiger mit
übergeben. void sort(void *entries[ ], int length, int (*compare)(void*, void*));
- Die als Argument übergebene Funktion kennt die tatsächlichen
Parametertypen, muss aber mit void*-Parametern definiert sein!
(c) schmiedecke 09 Info2-C++-Funktionen 19
Funktionszeiger: Deklarieren, Besetzen, Aufrufen.
int (*function)(int, char, char[]); // Variable "function" vom Typ // Zeiger auf int-Funktion // mit (int, char, char[])-Parametern int store(int index, char entry, char[] list) { list[index] = entry; } int isContent(int any, char letter, char[] text) { return text[index]==letter; } // bool as int function = &store; // & is optional (*function)(10, 'C', mytext); // * is optional function = isContent; int b = function(10, 'C', mytext);
(c) schmiedecke 09 Info2-C++-Funktionen 20
Funktionsüberladung
... wie in Java Wenn die Parameterlisten sich entscheidbar unterscheiden, kann der funktionsname mehrfach verwendet werden Unterschiedliche Funktionen an der Aufrufstelle unterscheidbar.
void swap(&char c1, &char c2); void swap(double d1, double d2); ...
(c) schmiedecke 09 Info2-C++-Funktionen 21
Operatorüberladung
... das kennt Java nicht! in C++ sind Operatoren Funktionen
– mit einem Symbol als Namen – und einer zusätzliche Aufruf-Syntax
... behandeln wir im Zusammenhang mit Klassen
- - also nächstes Mal
(c) schmiedecke 09 Info2-C++-Funktionen 22