Subtraktion -
Der Subtraktions-Operator führt eine Subtraktion zweier Elemente aus. Für arithmetische Typen entspricht dies der mathematischen Subtraktion zweier Zahlen.
|
|
Siehe auch Additions-Operator +
Details
Der Subtraktions-Operator erwartet zwei Operanden als rvalues und wird von links nach rechts abgearbeitet. Der Rückgabewert ist ein rvalue, dessen Typ grundsätzlich durch die arithmetische Umwandlung der beiden Operanden festgelegt ist.
Der Operator ist zulässig für arithmetische (Integer- und Fliesskomma-) Typen, den bool-Typ sowie Pointer. Boolsche Werte werden als Integer-Werte aufgefasst. Handelt es sich bei den Typen der beiden Operanden um Pointer-Typen, so wird nach den Regeln der Pointer-Arithmetik vorgegangen. Handelt es sich bei den Typen der beiden Operanden um arithmetische Typen, so wird gegebenfalls eine automatische arithmetische Umwandlung vorgenommen.
Der Subtraktions-Operator entspricht bei arithmetischen Typen grundsätzlich der mathematischen Subtraktion, wobei man den linken Operanden auch Minuend und den rechten Subtrahend nennt. Aufgrund der Rangordnung der Operatoren ist es möglich, einen Positiv- oder Negativ-Operator bei den beiden Operanden direkt hinzuschreiben.
|
|
Der Subtraktions-Operator entspricht der direkten Umsetzung des entsprechenden Subtraktions-Befehls in Assembler und kann somit für arithmetische Typen einen Over- oder Underflow ergeben, was bei Integer-Typen zu einem Wrap-Around führt.
|
|
Überladen des Operators
Der Subtraktions-Operator hat grundsätzlich die semantische Bedeutung einer Subtraktion im mathematischem Sinne. Allerdings gibt es Klassen, die eine andere Semantik definieren, beispielsweise die Subtraktion eines Characters von einem String, was in einem sogenannt getrimmten
String resultiert (sämtliche Vorkommen des Characters am Anfang und Ende des Strings werden entfernt). Auch weitere, ähnliche Anwendungen des Subtraktions-Operators wären denkbar.
Die Prototypen für das Überladen des Subtraktions-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):
|
|
Vorsicht ist geboten bei dem nicht-const Prototypen innerhalb der Klasse: Wenn er ausserhalb der Klasse steht, wird er von den Compilern nicht als Fehler erkannt, da er einem Prototypen des Negativ-Operators entspricht.
Im folgenden Beispiel wird eine Klasse präsentiert für einen zweidimensionalen Vektor. Gemäss der Vektoralgebra wird eine Subtraktion zweier Vektoren als die komponentenweise Subtraktion der Vektorfelder beschrieben.
|
|