Ich bin mir ziemlich sicher, dass die C ++ FAQ Lite dies wahrscheinlich abdeckt. Die, an die ich denken kann, sind der ternäre Operator, der .
Operator und der Scope Resolution Operator ( ::
). Da der Operator .
nicht überladen werden kann, kann auch .*
wahrscheinlich nicht sein.
Es gibt auch einige Operatoren, die fast nie überladen werden sollten, einschließlich des Kommaoperators &&
, ||
, die normalerweise einen Sequenzpunkt erzeugen. Die &&
und ||
werten auch (normalerweise) den richtigen Operanden aus, falls nötig. Keine dieser Eigenschaften trifft auf einen überladenen Operator zu.
Obwohl es einige Gründe dafür gibt, ist das Überladen des unären &
(address-of) -Operators oft auch eine ziemlich schlechte Idee. Die Adresse eines Objekts wird weitgehend mit seiner Identität gleichgesetzt, eine Überladung kann also einige andere Dinge relativ schwierig machen.
Edit: soweit es notwendig ist, den richtigen Operanden auszuwerten (alias "Shortcut evaluation"): Betrachte etwas wie x && y
. Der Ausdruck kann nur dann wahr sein, wenn der linke Operand wahr ist. Wenn der linke Operand mit false
ausgewertet wird, muss der Ausdruck ebenfalls false sein, und C (und C ++) garantieren, dass der rechte Operand überhaupt nicht ausgewertet wird. Dies ist praktisch (zum Beispiel), wenn Sie etwas wie if (ptr != NULL && ptr->member /*...*/ )
machen möchten. Wenn in diesem Fall der Zeiger in NULL ist, wird die Ausführung angehalten und Sie versuchen nie, den Zeiger zu dereferenzieren.
Dieselbe Grundidee ist wahr mit ||
, aber umgekehrt. Wenn in diesem Fall der linke Operand true
ergibt, dann muss der Ausdruck als Ganzes true
sein, unabhängig davon, was der rechte Operand auswerten würde, damit (wieder) C und C ++ in diesem Fall den rechten Operanden garantieren wird nicht ausgewertet.
Wenn Sie diese Operatoren jedoch überladen, wertet die Auswertung des Ausdrucks immer alle Operanden beide aus. Der erste Ausdruck würde versuchen, den Zeiger zu dereferenzieren, selbst wenn es ein Null-Zeiger ist, so würde es undefiniertes Verhalten geben.
Von dieser Artikel zum Überladen von Operatoren
Die meisten können überlastet sein. Die einzigen C-Operatoren, die nicht sein können, sind. und?: (und sizeof, was technisch ein Operator ist). C ++ fügt einige seiner eigenen Operatoren hinzu, von denen die meisten überladen werden können, mit Ausnahme von :: und. *.
so
.
?:
::
.*
Tags und Links c++ operator-overloading