My3Vector a(1,1,0), b(1,-1,1); My3Vector c = a + b; My3Vector d = a.Add(b); // equivalent
Syntax für Deklaration/Implementierung zunächst verwirrend, aber analog zu Member-function call.
Im My3Vector–Header:
My3Vector operator + ( My3Vector & p ); My3Vector Add( My3Vector & p ) ;
Regel für binäre Operatoren:
My3Vector My3Vector::operator + (My3Vector & v ) { My3Vector tv; tv.x = x + v.x; tv.y = y + v.y; tv.z = z + v.z; return tv; }
Mit Operator–Overloading ist
C++ quasi
Compiler–Compiler:
Man kann beliebige neue Datentypen erzeugen und dazu passende
Operationen definieren/implementieren:
Matrix–Multiplikation, Vektor–Addition, u.v.m.
Allerdings sorgfältiges Design wichtig:
Nicht immer ist es sinnvoll, z.B. Multiplikation
* für
My3Vector:
a * b ;
Skalar– oder Kreuz–Produkt ?
Nicht sinnvoll zu enscheiden
Im Zweifelsfall lieber lassen.
C++ Konvention ist, dass mehrere Zuweisungen möglich sind,
z.B.
My3Vector d = a += b;
+= Operator muss Typ My3Vector zurückgeben.
Implementierung:
My3Vector & My3Vector::operator += (My3Vector & v ) { x += v.x; y += v.y; z += v.z; return *this; }
“Verstecktes” Argument, ist Pointer auf das Objekt für das Funktion gerufen wird, d.h. für voriges Beispiel a += b gilt My3Vector * this = &a .
Rückgabe als Referenz verhindert unnötige Kopieraktionen.