<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Copy construktor &#x2F; Zuweisung Überladen]]></title><description><![CDATA[<p>Hi leute.</p>
<p>Habe in meinem Skript folgende Sachen stehen:</p>
<p>Copyconstruktor schlange:</p>
<pre><code class="language-cpp">Schlange::Schlange(const Schlange&amp; s){
ez = NULL;
Objekt *ptr = s.sz;
while (ptr != NULL) {
enq(ptr-&gt;data);
ptr = ptr-&gt;tail;
}
}
</code></pre>
<p>Und hier = Überladen, als Zueweisung:</p>
<pre><code class="language-cpp">Schlange&amp; operator= (const Schlange&amp; s) {
clear(); // Speicher freigeben
Objekt *ptr = s.sz;
while (ptr != NULL) {
enq(ptr-&gt;data);
ptr = ptr-&gt;tail;
}
return *this;
}
</code></pre>
<p>sz ist dabei mein Startzeiger, ez mein Endzeiger.</p>
<p>Die Funktion an sich ist ja quasi identisch; ich verstehe nicht, wieso ich bei der Zuweisung direkt am Anfang clear (dequeued einfach alle Elemente!) machen kann? Ich meine, ich brauche doch die Schlange noch, oder? Das ist doch quasi die &quot;rechte Seite&quot; bei der Zuweisung?</p>
<p>Wird der this Zeiger eigentlich immer bei der Zuweisung zurückgegeben? Und wieso muss ich bei der Zuweisung die Referenz der Schlange nehmen, oder muss ich das nicht, ist aber ressourcensparender? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Danke &amp; Schöne Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261928/copy-construktor-zuweisung-überladen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 23:40:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261928.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Feb 2010 16:27:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy construktor &#x2F; Zuweisung Überladen on Thu, 25 Feb 2010 16:27:06 GMT]]></title><description><![CDATA[<p>Hi leute.</p>
<p>Habe in meinem Skript folgende Sachen stehen:</p>
<p>Copyconstruktor schlange:</p>
<pre><code class="language-cpp">Schlange::Schlange(const Schlange&amp; s){
ez = NULL;
Objekt *ptr = s.sz;
while (ptr != NULL) {
enq(ptr-&gt;data);
ptr = ptr-&gt;tail;
}
}
</code></pre>
<p>Und hier = Überladen, als Zueweisung:</p>
<pre><code class="language-cpp">Schlange&amp; operator= (const Schlange&amp; s) {
clear(); // Speicher freigeben
Objekt *ptr = s.sz;
while (ptr != NULL) {
enq(ptr-&gt;data);
ptr = ptr-&gt;tail;
}
return *this;
}
</code></pre>
<p>sz ist dabei mein Startzeiger, ez mein Endzeiger.</p>
<p>Die Funktion an sich ist ja quasi identisch; ich verstehe nicht, wieso ich bei der Zuweisung direkt am Anfang clear (dequeued einfach alle Elemente!) machen kann? Ich meine, ich brauche doch die Schlange noch, oder? Das ist doch quasi die &quot;rechte Seite&quot; bei der Zuweisung?</p>
<p>Wird der this Zeiger eigentlich immer bei der Zuweisung zurückgegeben? Und wieso muss ich bei der Zuweisung die Referenz der Schlange nehmen, oder muss ich das nicht, ist aber ressourcensparender? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Danke &amp; Schöne Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861380</guid><dc:creator><![CDATA[jakap]]></dc:creator><pubDate>Thu, 25 Feb 2010 16:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Copy construktor &#x2F; Zuweisung Überladen on Thu, 25 Feb 2010 16:38:53 GMT]]></title><description><![CDATA[<p>jakap schrieb:</p>
<blockquote>
<p>Das ist doch quasi die &quot;rechte Seite&quot; bei der Zuweisung?</p>
</blockquote>
<p>Nein, es ist die linke. <code>s</code> ist die rechte Seite. Ich schätze damit dürften die Fragen geklärt sein?</p>
<p>edit: Ok, ich sehe, ein paar der anderen Fragen hängen nicht damit zusammen:</p>
<p>Q: Warum gibt man Referenzen zurück?<br />
A: Damit man sowas machen kann:</p>
<pre><code class="language-cpp">a=b=c;
</code></pre>
<p>Q: Warum gibt man <code>*this</code> zurück?<br />
A: Nun, was sonst? Denk daran: Die rechte Seite der Zuweisung ist in deinem Beispiel das <code>s</code> . Die linke Seite ist das Objekt, dass den Operator aufruft, also <code>this</code> . Und der Rückgabewert des Operators wird meistens gar nicht weiter verwendet, aber in Fällen wie <code>a=b=c</code> dient der Rückgabewert von <code>b=c</code> wieder als rechte Seite für die Zuweisung <code>a=(b=c)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861384</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 25 Feb 2010 16:38:53 GMT</pubDate></item><item><title><![CDATA[Reply to Copy construktor &#x2F; Zuweisung Überladen on Thu, 25 Feb 2010 17:21:06 GMT]]></title><description><![CDATA[<p>Dein operator= liefert übrigens ein falsches Resultat, wenn man eine Schlange sich selbst zuweist. Also am Anfang am besten ein if(this != &amp;s) einfügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861417</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 25 Feb 2010 17:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Copy construktor &#x2F; Zuweisung Überladen on Thu, 25 Feb 2010 17:36:24 GMT]]></title><description><![CDATA[<p>Hmmm... der Copy-Konstruktor ist nicht Exception-sicher.</p>
<p>Der Zuweisungsoperator ist auch nicht perfekt. Er lässt das Objekt in einem &quot;Zwischenzustand&quot;, falls ein Fehler auftritt. Er verkraftet auch keine &quot;Selbstzuweisung&quot;. In diesem Fall würde ich &quot;copy and swap&quot; empfehlen:</p>
<pre><code class="language-cpp">friend void swap(Schlange&amp; a, Schlange&amp; b);

Schlange&amp; operator= (Schlange kopie_der_rechten_seite) {
  swap(*this, kopie_der_rechten_seite);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1861427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861427</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 25 Feb 2010 17:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to Copy construktor &#x2F; Zuweisung Überladen on Thu, 25 Feb 2010 17:58:32 GMT]]></title><description><![CDATA[<p>aaah <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Also die beiden Funktionen sind ausm Skript kopiert, kann gut sein, dass die nicht perfekt sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Danke für die Antworten jedenfalls! Wie würde ich den Copy Konstruktor denn Exception sicher machen? Also wo liegt das Problem? Wo darf keine Exception geworfen werden?</p>
<p>Selbstzuweisung hab ich verstanden denk ich, aber nicht klar ist mir, was ihr mit &quot;Man kann dank Referenzen sowas machen : a=b=c&quot; meint. Sowas kannn ich doch auch mit kopierten Objekten machen oder?</p>
<p>Dankeschön <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861441</guid><dc:creator><![CDATA[jakap]]></dc:creator><pubDate>Thu, 25 Feb 2010 17:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to Copy construktor &#x2F; Zuweisung Überladen on Thu, 25 Feb 2010 19:18:30 GMT]]></title><description><![CDATA[<p>jakap schrieb:</p>
<blockquote>
<p>Danke für die Antworten jedenfalls! Wie würde ich den Copy Konstruktor denn Exception sicher machen? Also wo liegt das Problem? Wo darf keine Exception geworfen werden?</p>
</blockquote>
<p>Bei der Exceptoinsicherheit geht es nicht darum, dass keine Exceptions geworfen werden, sondern, dass wenn das passiet das Programm sich in einem möglichst unverändertem Zustand befindet. Wenn du als eine Memberfunktion hast, welche eine Exception wirft, dann darf (sollte) sich das Objekt in einem korrekten Zustand (möglichst unverändert) befinden. Wenn du also z.B in einer Liste neuen Speicher anforrdern möchtest, um sie zu vergrössern, dann solltest du zuerst den Speicher allokieren und dann erst anfangen zu kopieren und interne States zu verändern (was dann alles mit Mittel geschieht, welche keine Exception mehr werfen).<br />
Wenn jetzt in unserer hypothetischen Implementierung der Liste eine Exception geworfen wird, dann kannst du nachher noch korrekt auf die Liste zugreifen und z.B Daten auslesen o.ä. (um sie z.B abzuspeichern). Wenn die Liste sich plötzlich in einem inkonsitentem Zustand befindet, dann erhöt sich die Wahrscheinlichkeit für Fehler (z.B hättest du ja bereits die Grösse der Liste bereits auf einen neuen Wert gesetzt haben können, dann aber durch die exception in new doch nicht erreicht wurde und wenn du dann nochmal auf die Liste zugreifst und z.B darüber iterierst, dann kriegst du ein Problem).</p>
<p>Ein Kopierkonstruktor allerdings darf im Falle einer Exception in jeglichem Zustand sein, da es kein vollständiges Objekt gibt darf auch nicht darauf zugegriffen werden (es konnte ja nicht erstellt werden).<br />
Dort musst du höchstens darauf achten, dass du allfällige Ressourcen, welche du alloziert hast wieder frei gibst.</p>
<blockquote>
<p>Selbstzuweisung hab ich verstanden denk ich, aber nicht klar ist mir, was ihr mit &quot;Man kann dank Referenzen sowas machen : a=b=c&quot; meint. Sowas kannn ich doch auch mit kopierten Objekten machen oder?</p>
</blockquote>
<p>a=b=c bedeutet a=(b=c).</p>
<pre><code class="language-cpp">a.operator=( b.operator=(c) );
</code></pre>
<p>Es wird also zuerst c an b zugewiesen und dann das Resultat an a. In dem Falle ginge das auch per Kopie ja, allerdings ist es nicht nötig eine Kopie auf Vorrat zu erstellen, wenn die meistens nicht benötigt wird. Oftmals sieht man aber auch so etwas, wo der Unterschied von einer Referenz zu einer Kopier wichtig ist:</p>
<pre><code class="language-cpp">(a=b).foo ();
</code></pre>
<p>In dem Beispiel ist der Sinn nicht sehr ersichtlich, aber es gibt durchaus Fälle, wo ein solches Konstrukt einiges eleganter ist, als seperate Zuweisung und Aufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861475</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 25 Feb 2010 19:18:30 GMT</pubDate></item></channel></rss>