Überladbare C ++ - Operatoren

8

Welche Operatoren können in C ++ nicht überladen werden?

    
MKaufmann 20.05.2010, 14:22
quelle

7 Antworten

9

Aus Wikipedia:

%Vor%     
Jaap Weidemann 20.05.2010, 14:31
quelle
17

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.

    
Jerry Coffin 20.05.2010 14:28
quelle
9

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

  • .
  • ?:
  • ::
  • .*
BCS 20.05.2010 14:25
quelle
3

. , .* , ?: , :: , sizeof und typeid . (aus Ссылка )

    
Fred Larson 20.05.2010 14:26
quelle
3

Die folgenden Operatoren können in C ++ nicht überladen werden:

%Vor%     
AraK 20.05.2010 14:27
quelle
2

GIYF: Ссылка

Erstes Ergebnis:

Ссылка

  

Die meisten können überlastet sein. Das einzige C   Operatoren, die nicht sein können. und ?:   (und sizeof, das ist technisch ein   Operator). C ++ fügt einige eigene hinzu   Betreiber, von denen die meisten sein können   überladen außer :: und. *.

    
Tyler McHenry 20.05.2010 14:25
quelle
2

Die Operatoren . , :? , :: , .* , typeid und sizeof .

    
Jacob 20.05.2010 14:26
quelle

Tags und Links