Es gibt in C++ eine Menge von Operatoren:
+ - * / % // arithmetisch ~ & | ^ << >> // bitweise ++ -- // In/Dekrement + - // Vorzeichen = += -= *= /= %= // Zuweisung &= |= ^= <<= >>= == < > <= >= != // Vergleiche ! && || // logisch * & -> . // Adressen , () [] ?: :: // spezielle new delete sizeof # ## // Praeprozessor
Klassendefinition:
class CVector { ... CVector operator+( const CVector& right_operand ) const; ... }
d.h. wir deklarieren einen Operator + als binäre Operation, welche implizit (als Objekt der aufgerufenen Memberfunktion) den linken Operanden und explizit als Parameter den rechten Operanden erhält.
Vorstellungsmöglichkeit: Wir hätten auch eine Memberfunktion VectorAdd definieren können:
class CVector { ... Vector VectorAdd(const CVector& right_operand) const; ... };welche dann wie folgt benutzt worden wäre:
CVector a,b,c; c = a.VectorAdd(b); // c = a + bHier ist der linke Operand a das Objekt, dessen Memberfunktion VectorAdd mit Operanden b aufgerufen wird.
Mit der Operatorschreibweise gilt folgende Vorstellung: Der Compiler erkennt zuerst den linken Operanden, danach den Operator, und weiß dann, welche Klassegemeint ist (Typ des linken Operanden), und sucht dann eine Memberfunktion (hier operator+), deren Parameter mit dem Typ des rechten Operanden übereinstimmt.
Genau genommen, folgende beiden Zeilen sind äquivalent und können beide verwendet werden:
c = a + b; c = a.operator+(b);
Implementierung:
CVector CVector::operator+( const CVector& right_operand ) const { CVector v; // construction of a CVector #ifdef _DEBUG if(dimension!=right_operand.dimension) { cout << "fatal error: dimensions of vectors differ\n"; exit(1); } #endif for(int i=0;i<dimension;i++) v.vector[i]=vector[i]+right_operand.vector[i]; return v; } // destruction of the CVector v
Die Funktion ist const deklariert, d.h. sie kann keine Member-Variable ändern.
.