Positiv +

Der Positiv-Operator dient der expliziten Positiv-Kennzeichnung eines Elementes und wird in C auch mit unary plus bezeichnet. Er wird stets vor das zu kennzeichnende Element geschrieben, beispielsweise +value oder +999.

#include <stdio.h> int main(int argc, char** argv){ int pos = + 999; int neg = - 999; printf("%d\n", pos); printf("%d\n", + pos); printf("%d\n", neg); printf("%d\n", + neg); return 0; }

999 999 -999 -999

Siehe auch Negativoperator -

Details

Der Positiv-Operator erwartet einen Operanden als R-Wert und wird von rechts nach links abgearbeitet.

Die semantische Bedeutung der Positiv-Kennzeichnung ist die Multiplikation mit +1. Zumindest für die numerischen Typen ist somit klar, dass der Positiv-Operator keinerlei Wirkung hat, er ist kein Absolut-Operator, da er aus dem negativen Wert nicht einen positiven macht, sondern ihn nur mit +1 multipliziert. Für den Absolut-Wert ist die Funktion abs() zuständig.

Folgende Konstrukte sind wenig sinnvoll, jedoch möglich:

printf("%d\n", + + pos); printf("%d\n", + + neg); printf("%d\n", + + + + + + + pos);

999 -999 999

Vorsicht: Folgende Zeile sieht zwar fast gleich aus, allerdings handelt es sich aufgrund des fehlenden Abstandes zwischen den den beiden + hier um den Increment-Operator, welcher die Variable verändert:

printf("%d\n", ++ pos);

1000

Dieser Unterschied ist jedoch hinfällig, wenn der Positiv-Operator gemischt mit dem Negativ-Operator auftritt, da ein solcher Operator nicht existiert und somit als jeweils einzelne Positiv- und Negativ-Operatoren aufgelöst wird:

printf("%d\n", - + pos); printf("%d\n", -+ pos); printf("%d\n", + - pos); printf("%d\n", +- pos);

-999 -999 -999 -999

Der Positiv-Operator hat somit für den Programmierer in erster Linie nur kosmetischen Nutzen, da er Formeln und Zuweisungen übersichtlicher schreiben kann:

val1 = - 123; val2 = + 456; val3 = - 789;

Überladen des Operators

Den Positiv-Operator zu überladen macht nur selten Sinn, da bei normalen Anwendungen kaum Fälle auftreten, bei denen eine Multiplikation mit +1 irgend etwas bewirkt. Für Ausnahmen in speziellen mathematischen Theorien sei auf Expertenwissen verwiesen. Es ist trotzdem notwendig, den Operator zu definieren, denn die oben angesprochene Multiplikation mit +1 ist nur die semantische Bedeutung und wird nicht wirklich so übersetzt. Selbst kreierte Klassen müssten hierfür theoretisch ein 1-Element definieren, was jedoch in C++ so direkt nicht möglich ist, sondern nur über den Positiv-Operator. Wird somit der Positiv-Operator an einem Objekt aufgerufen, das keinem eingebauten Typ entspricht, erhält man den Fehler error: no match for 'operator+' in ....

Die Prototypen für das Überladen des Positiv-Operators sind die folgenden:

AnyType operator +(); AnyType operator +() const; AnyType operator +(Type m); AnyType operator +(Type& m);

Innerhalb der Klasse Ausserhalb der Klasse

Der Rückgabewert ist beliebig. Vorsicht ist geboten bei den Prototypen ausserhalb der Klasse: Wenn sie innerhalb der Klasse stehen, werden sie von den Compilern nicht als Fehler erkannt, da sie den Prototypen des Additions-Operators entsprechen.

Ein mehr oder weniger sinnvolles Beispiel für das Überladen des Operators ist das folgende, wo eine Matrix bei Auftreten des Positiv-Operators auf eine positive Determinante getestet und bei Negativität eine Warnung ausgegeben wird:

#include <cstdio> class Matrix22{ float a[4]; public: Matrix22(float d){a[0]=d; a[1]=0; a[2]=0; a[3]=d;} float& operator [](unsigned int i){return a[i];} float determinant() const {return a[0]*a[3] - a[1]*a[2];} const Matrix22& operator +() const { if(determinant() < 0){ fprintf(stderr, "Determinant negative!\n"); } return *this; } }; int main(int argc, char** argv){ Matrix22 m(1); printf("Determinant: %f\n", (+m).determinant()); m[0] = -1; printf("Determinant: %f\n", (+m).determinant()); return 0; }

Determinant: 1.000000 Determinant negative! Determinant: -1.000000