Konstante Kopie? (bei operator+())



  • Hey!

    Unser C++ Trainer hat den operator+() wie folgt definiert:

    const CBruch operator+(const CBruch&) const;
    

    Aber wozu einen const CBruch zurückgeben, und nicht einfach CBruch? Stilfrage? Hat doch keine Funktion? (Hab vergessen was der dazu gelabert hat)

    MfG



  • Ich frage mich, wie das überhaupt funktionieren soll. Für gewöhnlich definiert man den operator+ global (welcher ein neues Objekt erzeugt) und den operator+= als Methode:

    Methoden

    CBruch& operator+=(CBruch const&);
    

    Die Rückgabe einer konstanten Referenz ist hier m.E. gänzlich sinnfrei.

    Funktion

    CBruch operator+(CBruch const& left, CBruch const& right)
        {
            CBruch temp = left;
            temp += right; // Hier kommt die Methode zum Tragen
            return temp;
        }
    

    Grüße... Heiko



  • Warum + global? Ist doch Schwachsinn?

    const CBruch CBruch::operator+(const CBruch& br) const
    {
    	CBruch erg;
    	erg.z = z * br.n + br.z * n;
    	erg.n = n * br.n;
    	erg.kuerzen();
    	return erg;
    }
    

    Meine Frage wurde trotzdem nicht beantwortet.
    MfG



  • ceplusplus@loggedoff schrieb:

    Warum + global? Ist doch Schwachsinn?

    Nein, das ist sinnvoll. Damit sind Konvertierungen auch auf dem linken Operanden möglich.

    Man macht den Rückgabetyp const, damit man dem +-Ausdruck nichts zuweisen kann.



  • Da CBruch eine Klasse ist, die wiederum den Operator = (-=, /=, +=, ...) überladen haben könnte, könnte man auf die Idee kommen, folgendes zu machen:

    (bruch1 + bruch2) = bruch3
    

    Das ist mit builtin-Typen nicht möglich. Ist nun der Rückgabetyp von operator+, und damit auch das erzeugte temporäre Objekt, const, ist das nicht mehr möglich.



  • MFK schrieb:

    ceplusplus@loggedoff schrieb:

    Warum + global? Ist doch Schwachsinn?

    Nein, das ist sinnvoll. Damit sind Konvertierungen auch auf dem linken Operanden möglich.

    Gibst du mir dazu ein Beispiel?

    MFK schrieb:

    Man macht den Rückgabetyp const, damit man dem +-Ausdruck nichts zuweisen kann.

    Ahaa ok stimmt, danke! Dachte, das würde nicht gehen weil ein Funktionsaufruf doch kein L-Value ist...

    zB.

    int test()
    {
    	int x = 4;
    	return x;
    }
    
    int main()
    {
    	test() = 5;
    ...
    

    error C2106: '=': Linker Operand muss ein L-Wert sein

    MfG



  • ceplusplus@loggedoff schrieb:

    Gibst du mir dazu ein Beispiel?

    Angenommen, deine CBruch-Klasse hat einen Konstrukor für int. Wenn du dann nur einen Member-Operator+ hast, geht zwar

    CBruch a;
    int b;
    CBruch x = a + b;
    

    aber nicht

    CBruch x = b + a;
    

    Mit einem globalen Operator geht beides.



  • Ah stimmt, sorry, danke 😉

    MfG


Anmelden zum Antworten