30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

106 6. Po<strong>in</strong>ter und References<br />

e<strong>in</strong>er Variable beim Aufrufenden zu erreichen. Wie man <strong>in</strong> Zeile 33 sieht,<br />

funktioniert dies auch wie erwartet. Dass man auch e<strong>in</strong>e Reference e<strong>in</strong>em<br />

call-by-reference übergeben kann und dass dabei nicht plötzlich e<strong>in</strong>e Doppel-<br />

Reference mit schlimmen Folgen daraus wird, sieht man <strong>in</strong> Zeile 38.<br />

Obwohl es aus der Besprechung des Beispielprogramms eigentlich klar<br />

se<strong>in</strong> sollte, möchte ich es hier trotzdem explizit erwähnen, um ke<strong>in</strong>e Missverständnisse<br />

aufkommen zu lassen: Ke<strong>in</strong> e<strong>in</strong>ziger Operator wirkt auf<br />

e<strong>in</strong>e Reference selbst! Egal, welche Operatoren man auf e<strong>in</strong>e Reference<br />

Variable anwendet, sie wirken immer ausschließlich auf den<br />

Inhalt, der sich h<strong>in</strong>ter der Reference verbirgt! Es gibt also ke<strong>in</strong>e<br />

Möglichkeit, z.B. so etwas wie Po<strong>in</strong>terarithmetik (wird später noch genau<br />

erklärt) mit References durchzuführen.<br />

In der Natur von References liegt auch, dass man sie nicht e<strong>in</strong>fach z.B.<br />

mit e<strong>in</strong>em Zahlenwert <strong>in</strong>itialisieren kann. References s<strong>in</strong>d ja quasi versteckte<br />

Zeiger auf e<strong>in</strong>en Speicherplatz. Aus diesem Grund muss die Initialisierung<br />

immer mit e<strong>in</strong>em sogenannten lvalue erfolgen, denn nur dieser garantiert<br />

ja, dass dah<strong>in</strong>ter auch Speicherplatz existiert, der beschrieben werden kann.<br />

Und genau diese Eigenschaft führt uns zu e<strong>in</strong>em weiteren Punkt: References<br />

müssen unbed<strong>in</strong>gt immer bei ihrer Def<strong>in</strong>ition explizit <strong>in</strong>itialisiert<br />

werden!. Der Grund ist e<strong>in</strong>fach: Es wurde bereits erwähnt, dass ke<strong>in</strong> e<strong>in</strong>ziger<br />

Operator auf die Reference wirkt, sondern alle nur auf den Inhalt. Das<br />

bedeutet auch, dass es ja gar ke<strong>in</strong>e Möglichkeit gibt, das Ziel der Referenz<br />

nachträglich zu verändern, denn e<strong>in</strong>e Zuweisung will ja den Inhalt und nicht<br />

die Referenz zuweisen! Also kommt der expliziten Initialisierung e<strong>in</strong>er Referenz<br />

e<strong>in</strong>e besondere Rolle zu: Sie ist der e<strong>in</strong>zige Zeitpunkt, zu dem man <strong>in</strong><br />

der Lage ist, ihr Ziel zu setzen.<br />

E<strong>in</strong> kle<strong>in</strong>es Detail am Rande: Es war bereits davon die Rede, dass unter<br />

dem Begriff der expliziten Initialisierung das Setzen e<strong>in</strong>es Wertes bei der<br />

Def<strong>in</strong>ition geme<strong>in</strong>t ist und nicht das Zuweisen e<strong>in</strong>es Wertes irgendwann nach<br />

der Def<strong>in</strong>ition. Am Verhalten der Initialisierung von References sieht man<br />

e<strong>in</strong>deutig, dass auch der Compiler <strong>in</strong>tern e<strong>in</strong>e explizite Initialisierung ganz<br />

anders <strong>in</strong>terpretiert als e<strong>in</strong>e Zuweisung. Ansonsten wäre es nämlich nicht<br />

möglich, e<strong>in</strong>e Referenz überhaupt auf e<strong>in</strong>e Speicherstelle zeigen zu lassen,<br />

denn die Zuweisung bewirkt ja etwas gänzlich Anderes!<br />

Vorsicht Falle: Leider sieht man immer wieder, dass durch Unwissenheit<br />

oder Schlamperei besonders tolle Zeitbomben wie die folgende implementiert<br />

werden (reference_problems_demo.cpp):<br />

1 // reference problems demo . cpp − p o s s i b l e problems with r e f e r e n c e s<br />

2<br />

3 #<strong>in</strong>clude <br />

4 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

5<br />

6 <strong>in</strong>t32 &returnDeadVariable ( ) ;<br />

7<br />

8 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

9 <strong>in</strong>t ma<strong>in</strong> ( <strong>in</strong>t argc , char ∗ argv [ ] )

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!