Frage zu "Effektiv C++ programmieren"
-
Hallo,
hab eine Frage, hat sich beim Lesen des Buchs "Effektiv C++ programmieren" ergeben:
Bei Tipp 12, "Kopieren Sie alle Teile eines Objekts", steht geschrieben, dass man vom operator= nicht den Copy CTOR aufrufen soll, und umgekehrt (bei mir [3. Auflage, deutsch] auf Seite 80 unten, bzw. Seite 81 oben).Mmmmh, ein paar Seiten vorher steht beschrieben, dass man den operator= mit Copy Ctor und swap Funktion realisieren soll.
Jetzt bin ich ehrlich gesagt etwas verwirrt. Wie denn nun?
-
c++ frage schrieb:
Mmmmh, ein paar Seiten vorher steht beschrieben, dass man den operator= mit Copy Ctor und swap Funktion realisieren soll.
Jup, nennt sich copy&swap idiom.
Allerdings ist das definitiv nicht überall sinnvoll. Ich hab das Buch nicht, denke aber, er wird das mit dem nicht-nutzen nicht so pauschal gesagt haben.
-
c++ frage schrieb:
[...] steht geschrieben, dass man vom operator= nicht den Copy CTOR aufrufen soll, und umgekehrt
In welchem Zusammenhang steht das? Ein spezielles Beispiel?
Normalerweise macht man schon Copy-and-Swap, oder man lässt gleich die compilergenerierten Big Three.
-
Nexus schrieb:
Normalerweise macht man schon Copy-and-Swap, oder man lässt gleich die compilergenerierten Big Three.
Sind wir Höhlenmenschen oder was? Wir können doch auch explizit defaulten, wenn wir das nur für die Zuweisungsoperatoren möchten.

-
Hier in Grundzügen das zugehörende Beispiel:
Abgeleitet::Abgeleitet(const Abgeleitet& rhs) : Basis(rhs),m_ausAbgeleitet(rhs.m_ausAbgeleitet) { } Abgeleitet& Abgeleitet::operator=(const Abgeleitet& rhs) { Basis::operator=(rhs); m_ausAbgeleitet=rhs.m_ausAbgeleitet; return *this; }
-
Sone schrieb:
Nexus schrieb:
Normalerweise macht man schon Copy-and-Swap, oder man lässt gleich die compilergenerierten Big Three.
Sind wir Höhlenmenschen oder was? Wir können doch auch explizit defaulten, wenn wir das nur für die Zuweisungsoperatoren möchten.

Ist dir eigentlich schonmal aufgefallen, dass das Forum C++
(auch C++0x und C++11)heist. Bei deinen Posts denkt man immer, es ginge hier nur um C++11.
-
c++ frage schrieb:
Hier in Grundzügen das zugehörende Beispiel:
Abgeleitet::Abgeleitet(const Abgeleitet& rhs) : Basis(rhs),m_ausAbgeleitet(rhs.m_ausAbgeleitet) { } Abgeleitet& Abgeleitet::operator=(const Abgeleitet& rhs) { Basis::operator=(rhs); m_ausAbgeleitet=rhs.m_ausAbgeleitet; return *this; }bzw. die Frage:
Wäre es an dieser Stelle falsch, das copy and swap idiom zu verwenden?
Wenn ja, warum?
Wenn nein, auf was könnte der Autor dann hinauswollen? Warum verwendet er im Bsp. im operator= nicht Copy Ctor und swap, so wie er es ein paar Seiten weiter vorne empfohlen hat?
-
class foo { private: int i; public: foo(const foo& ori) { this->operator=(ori); // Das soll man nicht machen, da es unter Umständen das eigene Objekt beschädigt..... } foo& operator=(const foo& ori) { this->i = ori.i; return *this; } }; class bar { private: int i; public: bar(const bar& ori) { } bar& operator=(const bar& ori) { // .....Und anders herum geht es ja erst gar nicht, wie Scott auch gesagt hat: // Du kannst hier nicht den Copy-Constructor aufrufen und das eigenen Objekt mit Hilfe des Copy-Constructors auf einen neuen Wert setzen. bar(ori); // So geht es nicht, da es dasselbe ist wie bar ori; this->bar(ori); // Und so geht es auch nicht, es macht auch überhaupt gar keinen Sinn. // Wenn du nämlich in einem (Copy-)Constructor landest erstellst du ein neues Objekt. // Was ich damit meine ist. Im (Copy-)Constructor ist 'this' nicht mehr 'this' sondern ein neues Objekt. return *this; } };
-
c++ frage schrieb:
bzw. die Frage:
Wäre es an dieser Stelle falsch, das copy and swap idiom zu verwenden?
Wenn ja, warum?
Wenn nein, auf was könnte der Autor dann hinauswollen? Warum verwendet er im Bsp. im operator= nicht Copy Ctor und swap, so wie er es ein paar Seiten weiter vorne empfohlen hat?Wie Scott sagt, solltest du stets Copy&Swap verwenden, demnach ist es natürlich nicht falsch. Du bringst hier zwei Dinge durcheinander, aber ich gebe zu, es ist auch echt doof es richtig zu erklären. Scott will sagen, du sollst operator= und den Ctor nicht implementieren, indem du eine bestimmte Funktion mit dem eigenen Objekt aufrufst (z.B this->operator=). Das passiert bei Copy&Swap nicht, du rufst hier keine Funktion mit dem eigenen Objekt auf.
-
Vielen Dank für deine Mühe, jetzt ists mir klar

-
Sone schrieb:
Sind wir Höhlenmenschen oder was? Wir können doch auch explizit defaulten, wenn wir das nur für die Zuweisungsoperatoren möchten.

Lieber
HackerSone, wir wissen hier alle dass du so unglaublich cool bist, dass du für deine privaten kleinen C++-Spielereien einen modernen Compiler benutzt, der bereits die meisten C++11-Features unterstützt. Dieses Forum ist aber C++ im Allgemeinen gewidmet, speziell auch den Leuten, die in einer Firma arbeiten und deshalb evtl. gezwungen sind, einen Compiler von 2010 oder gar noch früher zu benutzen und dir deshalb wie Höhlenmenschen vorkommen. Tu uns allen den Gefallen und reite nicht ständig darauf herum - du wirkst nicht wie der coole C++-Checker der du gerne sein möchtest sondern wie ein nerviger Teenie.
Oder ums kurz auszudrücken: Halt doch bitte einfach mal den Rand.