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.

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

In den Zeilen 122–135 ist der “normale” Subtraktions-Operator def<strong>in</strong>iert.<br />

Dass vor der Subtraktion e<strong>in</strong>e Überprüfung stattf<strong>in</strong>det, ob die beiden Vektoren<br />

dieselbe Größe haben, ist nicht weiter neu. Genauso wenig Neuigkeiten<br />

bietet die Exception, die geworfen wird, falls ebendiese Größe nicht übere<strong>in</strong>stimmt.<br />

Auch die Deklaration der bad_alloc Exception ist klar, denn<br />

<strong>in</strong> Zeile 132 kann es ja passieren, dass beim Anlegen des Resultat Vektors<br />

die Speicheranforderung schief geht. Weil es ke<strong>in</strong>e s<strong>in</strong>nvolle Möglichkeit gibt,<br />

dieses Problem <strong>in</strong>nerhalb unseres Operators zu beheben, lassen wir die Exception<br />

nach oben durchfallen.<br />

In Zeile 132 kommt allerd<strong>in</strong>gs jetzt etwas vor, das bisher noch unbekannt<br />

ist: this. Das Keyword this steht für den Po<strong>in</strong>ter auf sich selbst,<br />

auch self Po<strong>in</strong>ter oder this Po<strong>in</strong>ter genannt. Dadurch haben alle Objekte<br />

die Möglichkeit <strong>in</strong>nerhalb ihrer Methoden auf die Adresse ihrer eigenen Instanz<br />

zuzugreifen. Natürlich gilt das nur für Methoden, die nicht static<br />

s<strong>in</strong>d, denn diese gehören ja zur Klasse und nicht zu e<strong>in</strong>er Instanz. Zeile 132<br />

legt also e<strong>in</strong>e Kopie der aktuellen Instanz an, auf der der Operator aufgerufen<br />

wurde. Von dieser Kopie wird dann <strong>in</strong> Zeile 133 durch den Aufruf von<br />

performSubtractOperation der andere Vektor abgezogen. Das daraus entstehende<br />

Resultat wird als return-Wert geliefert. Genau <strong>in</strong> Zeile 134 sieht<br />

man, wann der Block, der e<strong>in</strong>en Funktionsrumpf umschließt, als geschlossen<br />

betrachtet wird und damit die Lifetime von Variablen <strong>in</strong> diesem zu Ende<br />

ist: Erst, wenn return abgeschlossen und das Resultat “verarbeitet” wurde.<br />

Ansonsten müsste ja direkt beim Rücksprung bereits result destruiert werden,<br />

bloß dann würde man e<strong>in</strong> totes Objekt retournieren. Das wäre natürlich<br />

nicht im S<strong>in</strong>ne des Erf<strong>in</strong>ders.<br />

Die Methode performSubtractOperation wurde bewusst aus dem Operator<br />

herausgezogen, da sie auch beim Kurzzuweisungs-Subtraktionsoperator<br />

gebraucht wird. Oft wird dies anders modelliert und e<strong>in</strong> Operator verwendet<br />

e<strong>in</strong>fach e<strong>in</strong>en anderen Operator, z.B. - legt e<strong>in</strong> result Objekt an und wendet<br />

auf dieses dann den -= Operator an, bevor es retourniert wird. Davor<br />

möchte ich allerd<strong>in</strong>gs abraten, denn damit kommt es fast garantiert entweder<br />

zu doppelten Überprüfungen e<strong>in</strong>- und derselben E<strong>in</strong>schränkungen, oder es<br />

wird unnötigerweise e<strong>in</strong> Objekt angelegt, das im Fall e<strong>in</strong>er Exception wieder<br />

verworfen wird oder andere unnötige D<strong>in</strong>ge passieren. Als Grundregel möchte<br />

ich für solche Fälle sagen, dass es immer besser ist, e<strong>in</strong>e public Methode bzw.<br />

e<strong>in</strong>en public Operator so zu schreiben, dass alle Überprüfungen dar<strong>in</strong> vorgenommen<br />

werden und danach wird e<strong>in</strong>e <strong>in</strong>terne Methode aufgerufen, die nur<br />

noch die Operation ohne weitere Überprüfungen ausführt.<br />

Die Implementation des Subtraktions-Kurzzuweisungs-Operators <strong>in</strong> den<br />

Zeilen 156–168 ist im Pr<strong>in</strong>zip dieselbe, wie die des “normalen” Subtraktions-<br />

Operators. Der e<strong>in</strong>zige Unterschied besteht dar<strong>in</strong>, dass ke<strong>in</strong> result Objekt<br />

angelegt wird, sondern das Objekt selbst, auf dem der Operator aufgerufen<br />

wurde, verändert wird.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!