<?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[Objekt kopieren *this Zeiger]]></title><description><![CDATA[<p>Hallo,<br />
ich lese gerade das Buch C++ von A bis Z. Hier mal eine Methode, die ein Objekt kopieren soll:</p>
<pre><code class="language-cpp">void Mensch:kopie_Mensch(Mensch *p) {
Mensch tmp = *this;
*p=tmp;
}
</code></pre>
<p>Wieso kann man nicht gleich schreiben:<br />
*p=*this?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257205/objekt-kopieren-this-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 08:56:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257205.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Dec 2009 18:13:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 18:13:51 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich lese gerade das Buch C++ von A bis Z. Hier mal eine Methode, die ein Objekt kopieren soll:</p>
<pre><code class="language-cpp">void Mensch:kopie_Mensch(Mensch *p) {
Mensch tmp = *this;
*p=tmp;
}
</code></pre>
<p>Wieso kann man nicht gleich schreiben:<br />
*p=*this?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827420</guid><dc:creator><![CDATA[Johnas G.]]></dc:creator><pubDate>Thu, 24 Dec 2009 18:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 18:34:53 GMT]]></title><description><![CDATA[<p>Das hat was mit Exceptionssicherheit zu tun.</p>
<p>Wenn jetzt das neu erstellen eines Objektes fehl schlägt, dann hat das keinerlei Auswirkung auf das Objekt, was dir strenge Exceptionsicherheit gibt. Das komplexe ist ja das erstellen eines Objektes und das kann vielleicht fehl schlagen. Darum wird ein temporäres Objekt erstellt.<br />
Damit das aber geht, geht man davon aus, dass eben diese Zuweisung ebenfalls die strenge Garantie gibt, was meist durch ein swap realisiert wird, welches selbst die strenge Garantie geben soll. Das ganze nennt sich dann Copy/Swap Idiom.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827429</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 24 Dec 2009 18:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 18:52:31 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Das hat was mit Exceptionssicherheit zu tun.</p>
<p>Wenn jetzt das neu erstellen eines Objektes fehl schlägt, dann hat das keinerlei Auswirkung auf das Objekt, was dir strenge Exceptionsicherheit gibt. Das komplexe ist ja das erstellen eines Objektes und das kann vielleicht fehl schlagen. Darum wird ein temporäres Objekt erstellt.<br />
Damit das aber geht, geht man davon aus, dass eben diese Zuweisung ebenfalls die strenge Garantie gibt, was meist durch ein swap realisiert wird, welches selbst die strenge Garantie geben soll. Das ganze nennt sich dann Copy/Swap Idiom.</p>
</blockquote>
<p>Gute Begründung, aber ist das nicht die Begründung für</p>
<pre><code class="language-cpp">void Mensch:kopie_Mensch(Mensch *p) { 
  Mensch tmp = *this; 
  swap(*p,tmp);
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827436</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 24 Dec 2009 18:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 19:00:34 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>...Wenn jetzt das neu erstellen eines Objektes fehl schlägt, ...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">void Mensch:kopie_Mensch(Mensch *p) {
  *p=*this;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Wo wird denn hier ein neues Objekt <strong>erstellt</strong> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827438</guid><dc:creator><![CDATA[Chew-Z]]></dc:creator><pubDate>Thu, 24 Dec 2009 19:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 19:27:50 GMT]]></title><description><![CDATA[<p>Ehm ja. Ich habe da nur was von kopieren gelesen und den Code kurz gesehen und dann wars schon um mich geschehen, weil das sonst so eine Standardding ist. <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>Imo ist diese Funktion unnötig. Wenn man eine Kopie will, dann hat man dafür Copy Konstruktor oder aber eben den Zuweisungsoperator (den ich fälschlicherweise zuerst sehen wollte), wo dann das Copy/Swap Idiom vor kommt.</p>
<p>/EDIT<br />
Wenn diese Funktion nicht überflüssig wäre und man nicht den von dir gebrachten Vorschlag machen könnte, dann wäre jegliche Zuweisung mittels des =-Operators (Was dein Vorschlag ja genau ist) falsch, was ja definitiv nicht so ist..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827447</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 24 Dec 2009 19:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 22:06:05 GMT]]></title><description><![CDATA[<p>Also die Methode soll ja kein Objekt erstellen, sondern den Inhalt eines Objektes in ein anderes kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827495</guid><dc:creator><![CDATA[Johnas G.]]></dc:creator><pubDate>Thu, 24 Dec 2009 22:06:05 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Thu, 24 Dec 2009 22:26:39 GMT]]></title><description><![CDATA[<p>Johnas G. schrieb:</p>
<blockquote>
<p>Also die Methode soll ja kein Objekt erstellen, sondern den Inhalt eines Objektes in ein anderes kopieren.</p>
</blockquote>
<p>Jap. Und das ist genau die Aufgabe des = Operators. <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="😉"
    /><br />
Der wirkt dann aber normalerweise auf das aktuelle Objekt. Das heisst, dass das andere andere Objekt demjenigen übergeben wird, welches die Daten annehmen soll. Ist imo auch einiges intuitiver, als umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827501</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 24 Dec 2009 22:26:39 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Fri, 25 Dec 2009 08:42:04 GMT]]></title><description><![CDATA[<p>Ja. Das ist mir schon klar. Das wird auch ein paar Seiten weiter erläutert. Bei dem Beispiel ging es nur darum, Methoden mit Objekten als Parametern zu demonstrieren.</p>
<p>Aber wieso ist diese Variante jetzt unsicher:</p>
<pre><code class="language-cpp">void Mensch:kopie_Mensch(Mensch *p) {
  *p=*this;
}
</code></pre>
<p>Es wird ja gar kein Objekt erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827576</guid><dc:creator><![CDATA[Johnas G.]]></dc:creator><pubDate>Fri, 25 Dec 2009 08:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Fri, 25 Dec 2009 09:29:23 GMT]]></title><description><![CDATA[<p>Es ist unsicher, weil während der Zuweisung (von *p) eine Exception auftreten kann, welche eine inkonsistentes Objekt (*p) zur Folge haben kann.</p>
<p>Das wird, wie von anderen gesagt, mit dem Copy-Swap Idiom gelöst.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827586</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 25 Dec 2009 09:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Fri, 25 Dec 2009 09:44:30 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Es ist unsicher, weil während der Zuweisung (von *p) eine Exception auftreten kann, welche eine inkonsistentes Objekt (*p) zur Folge haben kann.</p>
<p>Das wird, wie von anderen gesagt, mit dem Copy-Swap Idiom gelöst.</p>
<p>Simon</p>
</blockquote>
<p>Die Begründung macht aber höchstens dann Sinn, wenn Pointer auf Heapobjekte geswapt werden. Wenn hier operator= eine Exception wirft, kann das auch erst bei der zweiten Zuweisung passieren. Damit wäre also nichts gewonnen.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827590</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 25 Dec 2009 09:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Fri, 25 Dec 2009 10:20:51 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Es ist unsicher, weil während der Zuweisung (von *p) eine Exception auftreten kann, welche eine inkonsistentes Objekt (*p) zur Folge haben kann.</p>
<p>Das wird, wie von anderen gesagt, mit dem Copy-Swap Idiom gelöst.</p>
<p>Simon</p>
</blockquote>
<p>Die Begründung macht aber höchstens dann Sinn, wenn Pointer auf Heapobjekte geswapt werden. Wenn hier operator= eine Exception wirft, kann das auch erst bei der zweiten Zuweisung passieren. Damit wäre also nichts gewonnen.</p>
</blockquote>
<p>Ja. Das ist aber per Definition der Exceptionsicherheit kein Problem.<br />
Kennst du die Definition überhaupt? - Exceptionsicherheit hats nichts damit zu tun, dass keine Exception geworfen werden darf, sondern lediglich, wie konsistent sich das System verhält, falls eine geworfen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827599</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 25 Dec 2009 10:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Fri, 25 Dec 2009 22:20:20 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Es ist unsicher, weil während der Zuweisung (von *p) eine Exception auftreten kann, welche eine inkonsistentes Objekt (*p) zur Folge haben kann.</p>
<p>Das wird, wie von anderen gesagt, mit dem Copy-Swap Idiom gelöst.</p>
<p>Simon</p>
</blockquote>
<p>Die Begründung macht aber höchstens dann Sinn, wenn Pointer auf Heapobjekte geswapt werden. Wenn hier operator= eine Exception wirft, kann das auch erst bei der zweiten Zuweisung passieren. Damit wäre also nichts gewonnen.</p>
</blockquote>
<p>Ja. Das ist aber per Definition der Exceptionsicherheit kein Problem.<br />
Kennst du die Definition überhaupt? - Exceptionsicherheit hats nichts damit zu tun, dass keine Exception geworfen werden darf, sondern lediglich, wie konsistent sich das System verhält, falls eine geworfen wird.</p>
</blockquote>
<p>Wo ist der Unterschied bezüglich Exceptionsicherheit, wenn die Zuweisung über ein Zwischenobjekt läuft? *p wird statt durch das Original jetzt durch die Kopie verändert. Sollte dabei aber eine Exception geworfen werden, kann *p genauso in einen inkonsistenten Zustand geraten. Können dagegen Pointer auf die eigentlichen Objekte umgesetzt werden erhält man garantiert ein in sich konsistentes Objekt:</p>
<pre><code>class C;
C* a = new C;
C* b = new C;

C* temp = new C;
*temp = *a;  // wenn Exception bleibt b unverändert
b = temp;  // b ist jetzt ein konsistentes Objekt
</code></pre>
<p>Echter Code müsste natürlich noch die Speicherlecks vermeiden.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827874</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 25 Dec 2009 22:20:20 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Fri, 25 Dec 2009 23:17:09 GMT]]></title><description><![CDATA[<p>Die Kunst liegt bei dem swap.</p>
<p>Also. Du verlagerst das Kopieren in ein temporäres Objekt, weil das eben fehl schlagen kann. Dann hast du ein komplettes, offensichtilch intaktes Objekt (falls nicht, dann bleibt alles beim alten).</p>
<p>Nun kannst du, und das ist die Voraussetzung, mit einem Nicht werfendem swap die Elemente des aktuellen Objektes und des anderen tauschen. Das funktioniert also garantiert.</p>
<p>Es heisst ja Copy/Swap und nicht Copy/Assign. Da hättest du ja eine endlose Rekursion. Mach dir die Funktionsweise von swap klar und auch warum es so wichtig ist, dass da nichts schief geht. (Im nächsten Standard gibt es dann die move Semantik, welche genau für so etwas da sein wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827887</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 25 Dec 2009 23:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Sat, 26 Dec 2009 08:12:14 GMT]]></title><description><![CDATA[<p>Man ist das kompliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827906</guid><dc:creator><![CDATA[Johnas G.]]></dc:creator><pubDate>Sat, 26 Dec 2009 08:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Sat, 26 Dec 2009 11:29:54 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Die Kunst liegt bei dem swap.</p>
<p>Also. Du verlagerst das Kopieren in ein temporäres Objekt, weil das eben fehl schlagen kann. Dann hast du ein komplettes, offensichtilch intaktes Objekt (falls nicht, dann bleibt alles beim alten).</p>
<p>Nun kannst du, und das ist die Voraussetzung, mit einem Nicht werfendem swap die Elemente des aktuellen Objektes und des anderen tauschen. Das funktioniert also garantiert.</p>
<p>Es heisst ja Copy/Swap und nicht Copy/Assign. Da hättest du ja eine endlose Rekursion. Mach dir die Funktionsweise von swap klar und auch warum es so wichtig ist, dass da nichts schief geht. (Im nächsten Standard gibt es dann die move Semantik, welche genau für so etwas da sein wird).</p>
</blockquote>
<p>Was du sagst ist richtig und läuft (z.Zt.) schlussendlich auf das swappen von Pointern hinaus.</p>
<p>Der Code im Originalpost hat damit aber nichts zu tun:</p>
<pre><code>void Mensch:kopie_Mensch(Mensch *p) {
Mensch tmp = *this;
*p=tmp;
}
</code></pre>
<p>enthält nun mal kein swap, sondern zwei Zuweisungen und ist deshalb genauso sicher oder unsicher wie</p>
<pre><code>void Mensch:kopie_Mensch(Mensch *p) {
*p=*this;
}
</code></pre>
<p>Auch std::swap ist z.Zt. eher ohne move implementiert und hilft dann nicht weiter.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827964</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 26 Dec 2009 11:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Sat, 26 Dec 2009 13:01:14 GMT]]></title><description><![CDATA[<p>Das stimmt natürlich. Wenn du Klassen hast, deren Kopie Exceptions werfen kann und die kein exceptionsicheres Swap anbietet, bringt der ganze Aufwand nichts. Genauso, wenn man unfähig ist, den Zuweisungsoperator mit Copy&amp;Swap zu implementieren.</p>
<p>Ich bezweifle auch, dass Move-Semantik dem abhelfen soll; schliesslich wird diese vor allem eingesetzt, um temporäre Kopien zu verhindern und ein Objekt gleich am Ziel zu konstruieren. Bei einem Tausch existieren beide Objekte schon vorher, wie soll hier durch Move automatisch ein exceptionsicheres Swap entstehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828000</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 26 Dec 2009 13:01:14 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt kopieren *this Zeiger on Sat, 26 Dec 2009 17:36:31 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Was du sagst ist richtig und läuft (z.Zt.) schlussendlich auf das swappen von Pointern hinaus.</p>
<p>Der Code im Originalpost hat damit aber nichts zu tun:</p>
</blockquote>
<p>Jap. Ich denke wir haben aneinander vorbei geredet. In meinen zweiten Post habe ich gesagt, dass das Beispiel so wirklich anderst geschrieben hätte werden können. Ich habe mich dann auf den die normale Implementierung des Assignments Operators gestützt. Dachte du meinst das.</p>
<p>/EDIT:<br />
Klar im Moment ist swap noch ohne move implementiert, aber das ändert sich dann in C++0x, wo das ganze dann darauf umgestellt wird:<br />
<a href="http://www2.research.att.com/~bs/C++0xFAQ.html#rval" rel="nofollow">http://www2.research.att.com/~bs/C++0xFAQ.html#rval</a><br />
Wegen der Exceptionsicherheit dachte ich ich hätte auch mal was dazu gelesen, dass das ganze erst richtig &quot;sicher&quot; macht. Aber das habe ich jetzt nicht mehr gefunden, kann mir aber auch persönlich gut vorstellen, dass es so ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828073</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 26 Dec 2009 17:36:31 GMT</pubDate></item></channel></rss>