Fehlerbehandlung (per Referenz?)
-
double divide(int a, int b) { MathError m1("Division durch 0"); MathError m2("Nenner negativ"); if(b == 0) throw m1; if(b < 1) throw m2; return double(a/b); } ------------------------------------------- try { bruch = divide(zaehler, nenner); cout<< bruch; } catch(MathError &m) <---- { cout<< m.getMessage();} }Hallo,
wird (siehe Pfeil) hier die Adresse des Objekts übergeben, wenn ich den Adressoperator verwende und wenn ich ihn weg lasse eine Kopie vom Objekt?
Habe gelesen, dass man es immer per Referenz übergeben soll, es funktioniert aber auch ohne!
-
throw wirft auf jeden Fall eine Kopie des lokalen Objekts (btw solltest du die Exceptions nicht "auf Vorrat" anlegen, das kostet nur Zeit), auf der catch-Seite kannst du nun bestimmen, wie diese Kopie entgegengenommen wird -
catch(MathError e)erzeugt sich eine eigene Kopie,catch(MathError& e)arbeitet mit dem von throw erzeugten Objekt.(interessant wird das, wenn die Kopier-Operation der Exception teuer ist - oder wenn du das Objekt modifizieren und weiterwerfen willst)
-
ok, dann ist es sinnvoller den Adressoperator zu verwenden. (wegen Speicher)
dann ist es doch aber keine Kopie, sondern das eigentliche Objekt oder ?
-
alexC++ schrieb:
ok, dann ist es sinnvoller den Adressoperator zu verwenden. (wegen Speicher)
Das ist in dem Fall kein Adressoperator, sondern eine Referenz
Und ja, es ist sinnvoller.dann ist es doch aber keine Kopie, sondern das eigentliche Objekt oder ?
Es ist nicht das Objekt m1, das du in der Funktion angelegt hast, falls du das meintest (dieses Objekt wurde beim Stack-Aufräumen zerstört - nachdem throw eine Kopie davon angelegt hat), aber zumindest ist es kein neues Objekt, das extra für deinen catch-Block angelegt werden mußte.
(ausführlichere Erklärungen findest du in der MSDN unter "Ausnahmebehandlung")
-
ok, danke dir!