Operatorenunverstaendniss

Surma

Erfahrenes Mitglied
Hossa,

ich versuche mich im moment mal mit Operatorenueberladung im Detail auseinanderzusetzen.
Nachdem ich viel bei google.de gefiltert hab, und ein bisschen gelesen hab,
hab ich nun ein Verstaendissproblem.

Code:
	MFraction operator + (const MFraction&, const MFraction&) const ;
	MFraction operator + (const MFraction&) const ;

Wo genau ist der Unterschied zwischen diesen beiden Operatoren, wann wird der eine, wann der andere aufgerufen. Ich weis, das der untere sich imemr automatisch auf das Objekt vor dem + bezieht.
Der erste Operator hat dafuer einfach nur ne Extravariable. Ist das der einzigste Unterschied? (Vielleicht mit einem kleinen Codebeispiel? *lieb guck*)
 
'+' ist ein binärer Operator, braucht also 2 Argumente.
Die erste Operator-Deklaration beschreibt eine Nicht-Element-Funktion, das heißt, sie gehört zu keiner Klasse. Daher müssen 2 Argumente angegeben werden.
Die zweite Operator-Deklaration ist eine nicht-statische Element-Funktion, das heißt, sie wird innerhalb einer Klassendeklaration implementiert. Da sie das eigene Objekt als ein Argument nimmt, braucht sie nur ein zusätzliches Argument.
Wenn beide Operator-Typen deklariert sind, dann gibt es bestimmte Regeln (die Regeln für den Argumentabgleich), nach denen entschieden wird, welche aufgerufen wird. Nach diesen Regeln könnte Dein Beispiel illegal sein, wenn beide Operatoren im gleichen Scope so deklariert werden, da beide die gleichen Argumenttypen haben. Da bin ich mir allerdings nicht 100%ig sicher, evtl. hat auch die Elementfunktion Vorrang. Wenn da einer genaueres weiß, bitte melden, das würde mich aucg interessieren. Die Regeln für den Argumentabgleich sind etwas kompliziert :confused:.
Aber vielleicht hat Dir das ja schon mal etwas weitergeholfen.
 
Mich wundert nur, das doch eigentlich das erste Argument IMMER das "eigene" Objekt ist.
also bei
Code:
  MFraction (1,2) + a ;
wird eben der 2 Operator mit dem MFraction-Objekt als eigene Variable aufgerufen.
Dreht man das ganze:
Code:
  a + MFraction (1,2) ;
Wird eben der Operator von a aufgerufen. MIr fehlt also einfach der Sinn dieser beiden Operatoren.
 
Zuletzt bearbeitet:
Vielleicht habe ich das nicht ganz klar ausgedrückt: Die Version mit 2 Argumenten ist NICHT Member einer Klasse sondern eine ganz normale (globale) Operator-Funktion. Da sie eben kein Member einer Klasse ist, hat sie kein eigenes Objekt, das sie als Argument nehmen kann.
 
Zurück