Frage zu operator+
-
Hallo,
im Artikel "Operatorüberladungen" (http://www.c-plusplus.net/forum/232010-full) heißt es:
Um eine implizite Typumwandlung des ersten Operanden zu ermöglichen werden die binären arithmetischen Operatoren üblicherweise als freie Funktionen definiert.
Warum ist das so? Ist es nicht egal, ob ich das als Methode oder als freie Funktion definiere/deklariere?
Bei operator+= steht davon nämlich nichts. Diese wird als Methode implementiert
Eine kleine Erläuterung wäre nett

-
theliquidwave schrieb:
Warum ist das so?
theliquidwave schrieb:
Um eine implizite Typumwandlung des ersten Operanden zu ermöglichen
-
Danke, das weiß ich auch.
Was ist damit gemeint?Beispiel. Meine Klasse bietet folgenden Konstruktor an:
A(int x);Und folgenden operator+:
const A operator+(const A &left, const A &right);Geht dann das hier?:
A a; B b = 2 + a;Oder was ist damit gemeint?
Sorry, habe keinen Compiler zum testen...
-
Beispiel: man nehme eine Klasse "MeineZahl". Die einen nicht-expliziten Konstruktor hat, der ints entgegen nimmt (d.h. ein int ist implizit in ein "MeineZahl" konvertierbar). Spendiere dieser Klasse einen (member-) operator+ und einen operator+=
MeineZahl m, m2, m3; int i; m = 5; //ok -> m = MeineZahl(5) m = m2 + m3; //ok -> m = m2.operator+(m3) m = m2 + 5; //ok -> m = m2.operator+(MeineZahl(5)) m = 5 + m3; //FEHLER: ein op+, der ein int und ein MeineZahl nimmt gibts nicht m += m2; //ok -> m.operator+=(m2) m += 7; //ok -> m.operator+=(MeineZahl(7)) i += m; //ist was völlig anderes -> m ist nicht in int konvertierbarBei einem freien op+ siehts so aus:
MeineZahl m, m2, m3; int i; m = 5; //ok -> m = MeineZahl(5) m = m2 + m3; //ok -> m = operator+(m2, m3) m = m2 + 5; //ok -> m = operator+(m2, MeineZahl(5)) m = 5 + m3; //ok -> m = operator+(MeineZahl(5), m3) m += m2; //ok -> m.operator+=(m2) m += 7; //ok -> m.operator+=(MeineZahl(7))
-
-
theliquidwave schrieb:
Beispiel. Meine Klasse bietet folgenden Konstruktor an:
A(int x);Damit kann automatisch ein zu
intkompatibler Wert in einAkonvertiert werden.Ist ein Operator als Memberfunktion überladen, so musst natürlich der linke Operand des Operators eine Instanz der Klasse sein. Beispiel, wenn
operator+eine Memberfunktion ist:A a; A b; a+b; // Gleichbedeutend mit a.operator+(b); ... funktioniert wunderbar. 2+b; // Ähh wie bitte? 2.operator+(b); ... das geht doch nicht!Beispiel, wenn
operator+eine freie Funktion ist:A a; A b; a+b; // Gleichbedeutend mit operator+(a,b); ... funktioniert wunderbar. 2+b; // Gleichbedeutend mit operator+(2,b); ... funktioniert wunderbar.Da du ja, wie oben erwähnt, eine automatische Konvertierung zu
Aermöglichst, funktioniert2+b, da 2 in einAkonvertiert werden kann.
-