30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

350 12. Operator Overload<strong>in</strong>g<br />

15 MathVector , id = 4 : operator + , other id = 5<br />

16 MathVector , id = 6 : copy constructor , other id = 4<br />

17 MathVector , id = 0 : operator = , other id = 6<br />

18 MathVector , id = 6 : d e s t r u c t o r<br />

19 MathVector , id = 5 : d e s t r u c t o r<br />

20 MathVector , id = 4 : d e s t r u c t o r<br />

21 MathVector , id = 3 : operator −= , other id = 2<br />

22 MathVector , id = 3 : d e s t r u c t o r<br />

23 MathVector , id = 2 : d e s t r u c t o r<br />

24 MathVector , id = 1 : d e s t r u c t o r<br />

25 MathVector , id = 0 : d e s t r u c t o r<br />

Die Zeilen 15–17 des Testprogramms erzeugen wie gehabt die Zeilen 1–3 im<br />

Output. Die Zuweisungs-Orgie <strong>in</strong> den Zeilen 20–21 f<strong>in</strong>det sich im Output<br />

<strong>in</strong> den Zeilen 4–9 wieder. In Zeile 24 des Programms zeigt sich erneut, was<br />

bereits <strong>in</strong> Abschnitt 9.2.3 erwähnt wurde: Die Initialisierung e<strong>in</strong>er Variable<br />

ist def<strong>in</strong>itiv nicht dasselbe, wie e<strong>in</strong>e Zuweisung e<strong>in</strong>es Wertes an e<strong>in</strong>e Variable.<br />

Sobald e<strong>in</strong>e Instanz e<strong>in</strong>er Klasse erzeugt wird und <strong>in</strong> der Initialisierung e<strong>in</strong>e<br />

“Zuweisung” e<strong>in</strong>es Wertes stattf<strong>in</strong>det, wird vom Compiler nachgesehen, ob<br />

es e<strong>in</strong>en passenden Konstruktor gibt. Wenn ja, wird dieser verwendet, wie<br />

es bei uns mit dem Copy-Constructor passiert. Gibt es ke<strong>in</strong>en, der genau<br />

passt, dann wird nach den üblichen Regeln derjenige ausgesucht, der “am<br />

besten” passt. Was nicht passiert, ist, dass zuerst der default Konstruktor<br />

verwendet wird und danach e<strong>in</strong> Aufruf des Zuweisungs-Operators erfolgt!<br />

F<strong>in</strong>det der Compiler ke<strong>in</strong>en passenden Konstruktor, quittiert er dies mit e<strong>in</strong>er<br />

Fehlermeldung!<br />

Das bedeutet, dass die beiden folgenden Codestücke<br />

MyClass var1 = 17;<br />

und<br />

MyClass var1;<br />

var1 = 17;<br />

absolut nicht dasselbe bewirken, obwohl dies oft fälschlich angenommen wird!<br />

Im ersten Fall wird e<strong>in</strong> Konstruktor gesucht, der als Parameter e<strong>in</strong>en <strong>in</strong>t<br />

nehmen kann. Im zweiten Fall wird zuerst das Objekt über den default<br />

Konstruktor konstruiert und danach wird über den Zuweisungsoperator 17<br />

zugewiesen (falls e<strong>in</strong> solcher Operator existiert).<br />

Genau dieser Unterschied ist es auch, warum man immer die Konstruktion<br />

und die damit e<strong>in</strong>hergehende Initialisierung von Members im Initialisierungsteil<br />

des Konstruktors (also nach dem : und vor dem Rumpf) vornehmen<br />

sollte, anstatt erst im Rumpf des Konstruktors e<strong>in</strong>e Zuweisung zu machen.<br />

Natürlich funktioniert das nur, wenn e<strong>in</strong> entsprechender Konstruktor zur<br />

Verfügung steht :-).<br />

Jetzt aber wieder zurück zu unserem Programm: Sehen wir uns an, was<br />

alles passiert, wenn Zeile 26 ausgewertet wird: Im Output schlägt sich diese<br />

Zeile nämlich gleich mit vielen Meldungen zu Buche, die von Zeile 11–20<br />

reichen:<br />

• Zu Beg<strong>in</strong>n wird der Operator * aufgerufen, der vector2 mit 2 multipliziert,<br />

wie <strong>in</strong> Zeile 11 des Outputs zu sehen ist.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!