Funktionen in C++
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 2
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 3
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 4
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 5
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 6
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 7
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 8
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 9
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 10
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 11
Rückgabe von Zeigern � Lebensdauer-Alarm! int *liesZahl () { int *liesZahl () { int *eingabe = new int; int eingabe; cin >> *eingabe; cin >> eingabe; return eingabe; return &eingabe; } } int *erzeugeListe() { int *erzeugeListe() { int liste[] = new int[10]; int liste[10] = {999}; return liste; return liste; } } char *liesText() { char *liesText() { char eingabe[] = new char[100]; char eingabe[100]; cin >> eingabe; cin >> eingabe; return eingabe; } return eingabe; } (c) schmiedecke 09 Info2-C++-Funktionen 12
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 13
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 14
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 15
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 16
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 17
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 18
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 19
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 20
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 21
Standardbibliotheken � C++ hat reich bestückte Standardbibliotheken � Recherchieren Sie bitte selbst ;) (c) schmiedecke 09 Info2-C++-Funktionen 22
... nächste Woche kommen die Objekte...
Recommend
More recommend