• Keine Ergebnisse gefunden

überladen werden, d.h. nach Typ und Anzahl der Parameter und Rückgabetyps

N/A
N/A
Protected

Academic year: 2021

Aktie "überladen werden, d.h. nach Typ und Anzahl der Parameter und Rückgabetyps"

Copied!
17
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Wenn Klassenoperationen

natürlich aussehen

(2)

Funktionsnamen können

überladen werden, d.h. nach Typ und Anzahl der Parameter und Rückgabetyps

Warum nicht auch alle definierten Operatorsymbole überladen?

Notwendig dazu:

Neuimplementierung von

Operatoren als überladbare

Funktionen

(3)

<Typ> operator⊗(<Param_Liste>);

bzw

<Typ> <Klassenname>::operator⊗(<Param_Liste>) {<Funktionsrumpf>

}

(4)

Man achte auf die Syntax!

Das Symbol ⊗ ist der zu überladende Operator

<Typ> ist meistens der Klassentyp

Die natürliche Operatorpräzedenz darf nicht geändert werden

Anzahl der Parameter darf nicht geändert werden, z. B. binäre

Operatoren bleiben binäre Operatoren

Operatoren können auch mit const

überladen werden

(5)

Operatoren sollten ihre

prädefinierte Bedeutung auch für neue Operationen beibehalten

Keine mehrdeutigen Operatoren, d.h. Operatoren mit mehreren

Interpretationen

Immer nach Schnittstellendefinition passende Operatoren suchen, z.B.

copy() wird Zuweisungsoperator

(6)

Überladene mehrfache Operatoren werden nicht automatisch aus

ihren überladenen Komponenten definiert

Z.B. += setzt sich nicht aus + und

= zusammen

Wenn solche Operatoren

überladen werden, dann auch

konsequent

(7)

! "

class Vektor{

private:

double x,y,z;

public:

Vektor(){}

Vektor(double a, double b, double c) : x(a), y(b), z(c) {}

void setX(double a){x = a;}

void setY(double b){y = b;}

void setZ(double c){z = c;}

Vektor operator+(const Vektor &);

Vektor operator-(const Vektor &);

Vektor operator&(const Vektor &);

Vektor& operator=(const Vektor &);

(8)

# !

#include "Vektor.h"

Vektor Vektor::operator+(const Vektor & op2) {

Vektor temp;

temp.x = x + op2.x; //oder (*this).x + op2.x temp.y = y + op2.y;

temp.z = z + op2.z;

return temp;

}

Vektor Vektor::operator-(const Vektor & op2) {

return Vektor(x - op2.x, y - op2.y, z - op2.z);

(9)

# ! $ %

Vektor Vektor::operator&(const Vektor & op2) {

Vektor temp;

temp.x = y*op2.z - z*op2.y;

temp.y = z*op2.x - x*op2.z;

temp.z = x*op2.y - y*op2.x;

return temp;

}

Vektor& Vektor::operator=(const Vektor & rhs) {

if (this != &rhs){

x = rhs.x; y = rhs.y;

z = rhs.z;}

return *this;

(10)

Zuweisungsoperator gibt Objekt des Typs Vektor zurück!

Grund: Mehrfache Zuweisungen, wie

v1 = v2 = v3;

müssen möglich sein

Der Zuweisungsoperator wird immer defaultmässig vom

Compiler zur Verfügung gestellt

(11)

&

#include "Vektor.h"

int main(void) {

Vektor v1(1,0,0), v2(0,1,0),v3,v4;

v3 = v1 + v2;

v4 = v1 & v2;

return 0;

}

(12)

friend ' (

Entwurfsprinzip: Überladener <<

Operator hat ersten Operanden als

ostream , zweiter Operand ist das

auszugebende Klassenobjekt und

der Rückgabetyp ist ein ostream

Konsequenz: << kann nicht als

Klassenfunktion implementiert

werden!

(13)

) *

Die Ein- und Ausgabeoperatoren

>> und << können als friend - Funktionen der zugrundliegenden Klasse definiert werden

Wegen Assoziativität soll (eine

Referenz auf) einen iostream

zurückgegeben werden

(14)

( + Vektor

class Vektor{

private:

double x,y,z;

public:

friend ostream & operator<<(ostream &, Vektor&);

friend istream & operator>>(istream &, Vektor&);

...

};

(15)

# (

ostream & operator<<(ostream &stream, Vektor &v) {

stream << "(" << v.x << "," << v.y << "," << v.z << ")";

return stream;

}

istream & operator>>(istream &stream, Vektor &v) {

cin >> v.x;

cin >> v.y;

cin >> v.z;

return stream;

}

(16)

Bei Eingabe: Fehlerprüfung. Falls Fehler

stream.setstate(ios_base::failbit);

Lese- und Schreiboperationen haben keine Wirkung im

Fehlerzustand! Lösung: immer

stream testen!

(17)

&

#include "Vektor.h"

int main(void) {

Vektor v1(1,0,0), v2(0,1,0), v3;

cout << v1 << " + " << v2 << " = ";

v3 = v1 + v2;

cout << v3 << endl;

return 0;

}

Ausgabe:

(1,0,0) + (0,1,0) = (1,1,0)

Referenzen

ÄHNLICHE DOKUMENTE

Á  Á  Á QNM4rÍÒ?4FdBKP0plHlB = ©&amp; &amp;¾QNMRrÍD=AbB DGJIe&lt;W=WG?¤F5AKFœBEŽdFdM²ÙRUlW=W!JODGMND=J&amp;UlW ;QÕJ rg¥NMNM!?¤F5AKFœBKŽdBKF5M.

std::out &lt;&lt; &#34;Dieses Programm lief um &#34; &lt;&lt; now.getFormattedString() &lt;&lt; endl;. daytime event(12,

[r]

[r]

und ergänzt die .nb-Unterlagen mit dem Mathematica-Befehl, um Matrizen zu potenzieren..

[r]

[r]

[r]