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 konvertierbar
    

    Bei 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:

    Sorry, habe keinen Compiler zum testen...

    http://ideone.com



  • theliquidwave schrieb:

    Beispiel. Meine Klasse bietet folgenden Konstruktor an:

    A(int x);
    

    Damit kann automatisch ein zu int kompatibler Wert in ein A konvertiert 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 A ermöglichst, funktioniert 2+b , da 2 in ein A konvertiert werden kann.



  • Vielen Dank an alle!

    pumuckl schrieb:

    http://ideone.com

    Nice.


Anmelden zum Antworten