======Übergabe der Argumente====== C+ + kennt mehrere Varianten, wie einer Funktion die Argumente übergeben werden können: call-by-value, call-by-reference und call-by-pointer. ===== call-by-value (Wertübergabe) ===== Bei call-by-value (Wertübergabe) wird der Wert des Arguments in einen Speicherbereich kopiert, auf den die Funktion mittels Parametername zugreifen kann. Ein Werteparameter verhält sich wie eine lokale Variable, die „automatisch“ mit dem richtigen Wert initialisiert wird. Der Kopiervorgang kann bei Klassen (Thema eines späteren Kapitels) einen erheblichen Zeit- und Speicheraufwand bedeuten! ===Beispiel=== #include #include using namespace std; //Prototyp, Deklaration int sumW(int x,int y); //Parameterübergabe per Wert (Value) int main(int argc, char** argv) { cout << "Hello World" << endl; int a=5,b=6,erg=0; cout << "Parameteruebergabe per Wert" << endl; erg=sumW(a, b); cout << "a: " << a < ===Beispielhafte Speicherbelegung des Programms im Hauptspeicher:=== ^Variable^Adresse^Wert| |a|0x0001|5| |b|0x0005|6| |…|.|.| |…|.|.| |x|0x00a1|5 -> 6| |y|0x00a5|6 -> 7| ===Die Ausgabe des Programms ist:=== Hello World Parameteruebergabe per Wert x: 6 y: 7 a: 5 b: 6 ===== call-by-reference (Übergabe per Referenz) ===== Sollen die von einer Funktion vorgenommen Änderungen auch für das Hauptprogramm sichtbar sein, müssen in C sogenannte Zeiger verwendet werden. C+ + stellt ebenfalls Zeiger zur Verfügung. C+ + gibt Ihnen aber auch die Möglichkeit, diese Zeiger mittels Referenzen zu umgehen, was im alten C nicht möglich war. Beide sind jedoch noch Thema eines späteren Kapitels. Im Gegensatz zu call-by-value wird bei call-by-reference die Speicheradresse des Arguments übergeben, also der Wert nicht kopiert. Änderungen der (Referenz-)Variable betreffen zwangsläufig auch die übergebene Variable selbst und bleiben nach dem Funktionsaufruf erhalten. Um call-by-reference anzuzeigen, wird der Operator & verwendet, wie Sie gleich im Beispiel sehen werden. Wird keine Änderung des Inhalts gewünscht, sollten Sie den Referenzparameter als const deklarieren, um so den Speicherbereich vor Änderungen zu schützen. Fehler, die sich aus der ungewollten Änderung des Inhaltes einer übergebenen Referenz ergeben, sind in der Regel schwer zu finden. #include #include using namespace std; //Prototyp, Deklaration int sumR(int &x,int &y); //Parameterübergabe per Referenz (Reference) int main(int argc, char** argv) { cout << "Hello World" << endl; cout << "Parameteruebergabe per Referenz" << endl; a=5,b=6,erg=0; erg=sumR(a, b); cout << "a: " << a < ===Beispielhafte Speicherbelegung des Programms im Hauptspeicher:=== ^Variable^Adresse^Wert| |x,a|0x0001|5 -> 6| |y,b|0x0005|6 -> 7| |…|…|…| |…|…|…| |…|…|…| |…|…|…| **Die Ausgabe des Programms ist:** Hello World Parameteruebergabe per Referenz x: 6 y: 7 a: 6 b: 7 ===== call-by-pointer (Übergabe per Zeiger) ===== Wenn Sie einen Zeiger als Parameter an eine Funktion übergeben, können Sie den Wert an der übergebenen Adresse ändern. #include #include using namespace std; //Prototyp, Deklaration int sumZ(int *x,int *y); //Parameterübergabe per Zeiger (Pointer) int main(int argc, char** argv) { cout << "Hello World" << endl; cout << "Parameteruebergabe per Zeiger" << endl; a=5,b=6,erg=0; erg=sumZ(&a, &b); cout << "a: " << a < ===Beispielhafte Speicherbelegung des Programms im Hauptspeicher:=== ^Variable^Adresse^Wert| |a|0x0001|5 -> 6| |b|0x0005|6 -> 7| |…|…|…| |…|…|…| |*x|0x00a1|0x0001| |*y|0x00a5|0x0005| **Die Ausgabe des Programms ist:** Hello World Parameteruebergabe per Zeiger x: 6 y: 7 a: 6 b: 7