================================ Parameterübergabe und Referenzen [TOC] ================================ Sowohl in C als auch C++ werden Parameter grundsätzlich per _call by value_ übergeben, d.h. sie werden kopiert und die Funktion, die einen Parameter verändert, ändert damit ihre private Kopie und nicht die entsprechende Variable des Aufrufers. Dies lässt sich an einem einfachen Beispiel demonstrieren: :import: session7/call1.cpp Die gleiche Verhaltensweise haben wir auch bei kompositen Objekten wie bei einer `struct`. Die Funktion `transpose` in dem folgenden Beispiel hat entsprechend keinen Effekt: :import: session7/call2.cpp In C++ gehört `std::swap` zu den Standardfunktionen, mit denen die Werte zweier Variablen effizient ausgetauscht werden können. Wenn wir in C einer Funktion die Möglichkeit geben wollten, den Wert einer übergebenen Variable zu verändern, haben wir nicht den Wert, sondern einen Zeiger auf die Variable übergeben. Dann ist auch eine Änderung möglich: :import: session7/call3.cpp Hier hat sich die Funktion `f` deutlich verändert. Überall, wo zuvor `i` stand, musste dies durch `*i` ersetzt werden, d.h. der Zeiger musste jeweils dereferenziert werden. Dies lässt sich in C++ eleganter mit Referenzen lösen. Eine Referenz ist ein Alias für ein anderes Objekt mit einem impliziten Zeiger darauf. Implizit heisst hier, dass wir Referenzen nicht explizit dereferenzieren müssen wie Zeiger. Der implizite Zeiger kann nicht verändert werden, d.h. eine Referenz wird bei der Erzeugung mit genau einem Objekt dauerhaft verbunden. :import: session7/call4.cpp Es ist beachtenswert, dass der einzige Unterschied zwischen dieser Fassung und dem Ausgangsbeispiel darin besteht, dass bei `f` die Parameterdeklaration `int val` durch `int& val` ersetzt worden ist. Somit ist `val` in `f` eine Referenz. Beim Aufruf von `f(i)` wird die Referenz von `val` an die Variable `i` gebunden. Aufgabe ======= Wie kann `transpose` in dem obigen Beispiel so angepasst werden, dass es funktioniert? :navigate: up -> doc:index back -> doc:session7/page02 next -> doc:session7/page04