Funktionen in C++ Funktionen und Parameter Wie in Java: - - PowerPoint PPT Presentation

funktionen in c funktionen und parameter
SMART_READER_LITE
LIVE PREVIEW

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


slide-1
SLIDE 1

Funktionen in C++

slide-2
SLIDE 2

(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)

slide-3
SLIDE 3

(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;

slide-4
SLIDE 4

(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

slide-5
SLIDE 5

(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];

slide-6
SLIDE 6

(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; }

slide-7
SLIDE 7

(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;

slide-8
SLIDE 8

(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, ',', '/');

slide-9
SLIDE 9

(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

slide-10
SLIDE 10

(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

slide-11
SLIDE 11

(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!

slide-12
SLIDE 12

(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; }

slide-13
SLIDE 13

(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; }

slide-14
SLIDE 14

(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;

slide-15
SLIDE 15

(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").

slide-16
SLIDE 16

(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

slide-17
SLIDE 17

(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

slide-18
SLIDE 18

(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!

slide-19
SLIDE 19

(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);

slide-20
SLIDE 20

(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); ...

slide-21
SLIDE 21

(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
slide-22
SLIDE 22

(c) schmiedecke 09 Info2-C++-Funktionen 22

Standardbibliotheken

C++ hat reich bestückte Standardbibliotheken Recherchieren Sie bitte selbst ;)

slide-23
SLIDE 23

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