Referenz oder Pointer im Funktionsaufruf, was kann man nutzen?

Referenzen können nicht all das erledigen, was Pointer (Zeiger) erledigen können. Dennoch tragen sie enorm zur Lesbarkeit des Quellcodes durch Entfernung expliziter Dereferenzierung bei. Insbesondere bei Veränderung von Argumenten im Innern von Methoden.

Nehmen wir folgende Funktion an:

void ChangeIt(int num) {
  num = 5;
}

Was passiert, wenn wir folgenden Code ausführen:

int MyNum = 1;
ChangeIt(MyNum);
cout << "MyNum = " << MyNum << endl;

Java Entwickler werden davon ausgehen, dass “MyNum” nun den Wert “5” enthält, da eine automatische Dereferenzierung vorgenommen wird. In C++ wird lediglich der in “MyNum” enthaltene Wert in die Funktion gegeben. “ChangeIt()” kann den Parameter “MyNum” ändern, so viel es möchte, wird dadurch aber nur die lokale Kopie beeinflussen, die Änderungen werden nicht zurückgegeben. Es gibt nur eine Möglichkeit, dass Methoden ihnen übergeben Parameter verändern:

void ChangeIt(int *num) {
  *num = 5;
}

int MyNum = 1;
ChangeIt(&MyNum);
cout << "MyNum = " << MyNum << endl;

In diesem Fall wird nur die Adresse von “MyNum” übergeben. “ChangeIt” hat einen Zeiger um “MyNum” zu verändern.

Es ist hässlich und verunstaltet den Code mit “&” und “*”, die man nicht durcheinander bringen darf und auch noch an der richtigen Stelle das korrekte Zeichen nutzen muss.C++ bietet aber eine hübschere Alternative:

void ChangeIt(int &num) {
  num = 5;
}

int MyNum = 1;
ChangeIt(MyNum);
cout << "MyNum = " << MyNum << endl;

“num” wird als Referenz in der Signatur übergeben. Dadurch wird es lediglich zu einem anderen Namen als “MyNum”. Ab jetzt funktioniert die Manipulation von “MyNum” durch “ChangeIt” identisch wie in Java.

Nicht nur die Lesbarkeit wird erhöht, man kann auch jede Menge Zeit sparen. Wir wir gesehen haben, wir Standardmäßig eine Kopie erstellt ( ChangeIt(int num) ), egal ob es sich dabei lediglich um ein einzelnes Byte, oder eine Liste von mehreren Gigabyte handelt. Funktionsparamter als Referenzen aufzurufen vermeidet dies und führt zu folgender goldenen Regel: Reiche Objekte immer als Pointer oder Referenzen an Methoden weiter, niemals als Wert.

Weitergehende Informationen:
http://www.online-tutorials.net/c-c++-c/c%2B%2B-tutorial-kleine-einfhrung-in-die-oop/tutorials-t-1-230.html#klassen-und-objekte

This entry was posted in C++, Java. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *