funktionen in c funktionen und parameter
play

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


  1. Funktionen in C++

  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 2

  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 3

  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 4

  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 5

  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 6

  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 7

  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 8

  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 9

  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 10

  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 11

  12. 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

  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 13

  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 14

  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 15

  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 16

  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 17

  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 18

  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 19

  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 20

  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 21

  22. Standardbibliotheken � C++ hat reich bestückte Standardbibliotheken � Recherchieren Sie bitte selbst ;) (c) schmiedecke 09 Info2-C++-Funktionen 22

  23. ... nächste Woche kommen die Objekte...

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend