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) = bruch3Das 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