Frage zu Operator=
-
Hm, das wusst ich nicht. Was für nen Grund gibts denn dafür?
-
Uchuujinsan schrieb:
Hm, das wusst ich nicht. Was für nen Grund gibts denn dafür?
Vorranig spart man unnötige Objektkopien.
-
Öhm, wo denn?
operator= nimmt doch normalerweise auch ne const referenz?
Die eine Referenz ist doch jetzt nicht der Weltuntergang, vorallem bei nicht zeitkritischen Sachen.
Gewinnen tut man vorallem Wartbarkeit und Übersichtlichkeit (keine code duplikation, änderungen müssen nur 1 mal im operator= gemacht werden), ich dachte wer unbedingt 100% performance will soll C, bzw im C-Stil programmieren.Es gibt sicher auch Situationen in denen es nicht geht, z.B. wenn (warum auch immer) der copy-ctor was anders machen soll als der zuweisungsoperator, aber im Normalfall ist es die einfachere und übersichtlichere Lösung. Hab ich zunmindest immer geglaubt :>
-
Ach du meinst den assignment operator im copy ctor. Das Problem hierbei ist das einige deiner Member doppelt initialisiert werden. Und das kann mitunter ganz fatale Auswirkungen haben, und nein: da geht es nicht um jedes bisschen Performanz.
-
Moment moment:
Initialisierung ist doch immer vor der Ausführung eines Konstruktors - wo sollte dann bei der Ausführung irgendwo noch eine doppelte Initialisierung stattfinden?Es ist natürlich schon so, wenn z.B. im operator= ein delete auf ein altes array ausgeführt, um danach das neue anzulegen, dann gehts nicht, aber das weiß ich als derjenige der die Klasse schreibt normalerweise selber - ich sehe immer noch nicht ein prinzipielles "dont do this". Und irgendwelches speichermanagement wird ja wohl bei einer Bruchklasse hoffentlich nicht haben :>
Davon bin ich jedenfalls ausgegangen.
Selbst wenn im Zuweisungsoperator neuer speicher angefordert/alter gelöscht wird, kann man je nachdem wie das geschrieben ist es immer noch so implementieren.Naja, meine Aussage war wohl etwas zu unüberlegt, hätte vllt noch einschränken sollen dass es nur "wahrscheinlich" geht.
Oder liegt ich immer noch völlig falsch?
-
Da liegst du falsch! Deine diversen Objekte werden nicht im assignment Operator initialisiert! Richtig initialisiert wird in der Initialisierungsliste. Siehe hierzu auch http://msdn.microsoft.com/en-us/magazine/cc163742.aspx
-
Deine diversen Objekte werden nicht im assignment Operator initialisiert!
Das hab ich auch nicht behauptet.
Ich habe behauptet die Werte werden vor der Ausführung des ctors initialisiert, mit der default initialisierung, oder eben mit einem speziellen wert wenn für das entsprechende objekt ein eintrag in der Initialisierungsliste besteht.
Aber - in beiden Fällen vor ausführung des ctors, nix andres hab ich gesagt :>Das einzige was der in dem link anders erzählt ist als ich gedacht hab, dass man eine Variable nochmals initialisiert, ich dachte das würde dann einfach nur zuweisung heißen.
Ich zitiere den Kommentar zum call von operator=:
This code works fine for many classesEr ist zwar gegen diese Methode, aber nur aus performancegründen.
Calling operator= from your copy constructor will certainly work, but it's not the most efficient implementation
-
Nix anderes hab ich gesagt!
Und im Endeffekt kommt es natürlich stark auf den jeweiligen Fall an ob, und welche, Nachteile entstehen. Aber die abwesendheit eines virtuellen Destruktors für Basisklassen funktioniert ja auch für viele Fälle...Wenn du dir unbedingt teilweise doppelten Code sparen willst dann implementier doch den assignment Operator mithilfe des copy and swap Idioms.
-
ich habe es jetzzt so gemacht wie es am anfang empfohlen wurde, habe einfach nur die += und Kohorten implementiert, machen ja eigentlich nix anderes.Danke trotzdem für eure ausführliche Diskussion, hat mir sehr weitergeholfen.
-
@david
Ich glaub wir haben uns dann gegenseitig ziemlich mißverstanden ^^

@firefighter
sry dass wir ein bißchen OT geworden sind, aber gut dass dir wohl geholfen wurde