ich begreif operatorüberaldung nicht,kanns jmd gut erklären?



  • wie der titel schon sagt, hab ich damit probleme!

    zB wann in klasse, wann ausserhalb?
    wann welcher rückgabetyp?
    wann und warum mal einer od 2 parameter?(besonders bei operator+)
    wann referenz zurück, wann neues objekt?

    kann mir das jemand vielleicht an beispielen mal genau erklären?



  • =(! schrieb:

    zB wann in klasse, wann ausserhalb?

    Normalerweise in Klasse, außer du kannst nicht.

    Ausnahmefälle sind:
    a) du willst implizite Umwandlung für den linken Operand:

    bigInt bi(4711),bj;
    bj = bi + bi; // klappt
    bj = bi + 15; // klappt
    bj = 15 + bi; // funktioniert NUR mit globalem operator+
    

    b) du kannst die Klassendefinition des linken Parameters nicht ändern (betrifft vor allem die Stream-Operatoren << und >>)

    wann welcher rückgabetyp?

    Theoretisch ist alles möglich. Praktisch solltest du eine Referenz zurückgeben, wenn du deinen eigenen Status geändert hast (=, +=, Prä-Inkrement) und einen Wert, wenn du ein temporäres Objekt erzeugt und darauf gerechnet hast (+, Post-Inkrement)

    wann und warum mal einer od 2 parameter?(besonders bei operator+)

    Operatoren als Memberfunktion bekommen einen (binärer Operator) oder gar keinen Parameter (unärer Operator) - dort wird als linker bzw. einziger Operand *this verwendet. Operatoren als globale Funktion bekommen zwei bzw. einen Parameter.
    (und + hat eine Doppelbedeutung - die gibt's sowohl in unärer Form (Vorzeichen) als auch in binärer Form (Addition))

    wann referenz zurück, wann neues objekt?

    Siehe oben


  • Mod

    CStoll schrieb:

    =(! schrieb:

    zB wann in klasse, wann ausserhalb?

    Normalerweise in Klasse, außer du kannst nicht.

    eher umgekehrt (dazu auch(http://www.gotw.ca/gotw/084.htm). memberfunktionen dann, wenn es sein muss:
    - construktoren/Destruktor,operator=,operator[]
    - virtuelle funktionen
    - wenn zugriffskontrolle(private/protected) benötigt wird
    alles andere ist verhandelbar - wichtig ist konsistenz und hier haben freie funktionen den grossen vorteil, dass man das interface einer klasse erweitern kann, ohne diese klasse selbst zu verändern; bei den binären operatoren kommen symmetrieüberlegungen hinzu (das problem der implizen konvertierung auf dem linken operanden ist nur ein aspekt davon). sofern mutierende operationen zum verketten geeignet seinsollen, müssen sie memberfunktionen sein - das ist ein nachteil der (noch) rvalue-referenzen.





  • =(! schrieb:

    zB wann in klasse, wann ausserhalb?

    Grundsätzlich kannst du dir merken, alle binären Non-Assignment Operatoren ausserhalb, der Rest innerhalb.

    =(! schrieb:

    wann welcher rückgabetyp?

    Das ist von Operator zu Operator unterschiedlich. Logische Operatoren geben logischerweise bool zurück. Logisch, oder? Assignment Operatoren das eigene Objekt (*this), also Rückgabetyp ist eine Referenz auf die eigene Klasse. Binäre Verknüpfungsoperatoren ein Objekt der eigenen Klasse, diesmal aber by-value da temporär und wenn möglich const (falls man vorhat, die Funktionsweise von primitiven Typen zu implementieren). Grundsätzlich kann man aber keine generellen Aussagen treffen, da du gewisse Freiheiten hast und diese natürlich auch nutzen kannst. Wähle den Rückgabetyp einfach so, dass er der Situation am besten entspricht.



  • also anscheinend ist gerade die operatorüberladung auch ein nicht ganz einfaches thema oder?
    Jetzt ein ja würde mir helfen 😕



  • Nene, das ist das trivial.



  • Einen Operator zu schreiben ist recht einfach, wenn man ein paar Feinheiten beachtet (Member/Global, Paramteranzahl,...) - schwierig wird es erst, wenn du den Operator "richtig" schreiben willst (dabei solltest du dich dann an der vordefinierten Bedeutung der Operatoren für eingebaute Typen orientieren - "do it as the int's").


Anmelden zum Antworten