Operator overloading


In C++ können Standardoperationen, wie =, +, *, etc für beliebige Klassen definiert, d.h. `überladen' werden.
Z.B. kann man in der My3Vector Klasse den Additionsoperator + definieren und dann einfach:


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:


Implementierung:

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 \bgroup\color{green}\ensuremath{\Rightarrow}\egroup Im Zweifelsfall lieber lassen.


C++ Konventionen sollen beachtet werden, z.B. += Operator:
  My3Vector a(1,1,-1), b(2,0,3):
  a += b;
Als Operation sicher sinnvoll.

C++ Konvention ist, dass mehrere Zuweisungen möglich sind, z.B.
  My3Vector d = a += b;

\bgroup\color{green}\ensuremath{\Rightarrow}\egroup += Operator muss Typ My3Vector zurückgeben.

Implementierung:

My3Vector & My3Vector::operator += (My3Vector & v ) {
  x += v.x;
  y += v.y;
  z += v.z;
  return *this;
}


Neues Syntax-element 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.



GDuckeck 2019-08-01