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 |
|