<?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[constructor, copy constructor und move semantic]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>nachdem ich von euch zuletzt über die Regeln der Drei gebrieft wurde, möchte ich das ganze gerne auch verstehen.</p>
<p>Meine Problem ist bisher, dass ich das ... Problem noch nicht recht verstehe.</p>
<p>Nach meinem bisherigen Verständnis sind die ersten Schlagwörter dazu Pointer und Heap:<br />
Wenn ein Programm an mehreren Stellen ein Objekt benötigt, dann genügt es zu wissen wie dieses Objekt erreicht werden kann, d.h. es muss lediglich die Adresse weitergegeben werden.<br />
Meist kommt in Verbindung mit Pointern dann <code>new</code> und <code>delete</code> , d.h. ein Objekt wird zur Laufzeit auf dem Heap initialisiert und der Pointer zeigt nun auf eine Adresse auf dem Heap.<br />
Nun gibt es mehrere unglückliche Varianten, dass z.B. der Speicher auf dem Heap wieder freigegeben wird und der Pointer bei späterer Verwendung dummerweise ins Leere zeigt (dangling pointer?). Oder umgekehrt, dass der Pointer eine neue Adresse bekommt und damit der Inhalt der vorherigen Adresse nicht mehr zugänglich ist (garbage).</p>
<p>Der nächste Level scheint dann erreicht zu werden, wenn es um (Kopier?) Konstruktoren und Zuweisung geht. Der Konstruktor wird meist im Zusammenhang mit Klassen genannt, aber eigentlich ruft eine implizite Initialisierung schon einen Konstruktor auf:</p>
<pre><code>int i(5);
</code></pre>
<p>Und genauso ruft eine explizite Initialisierung den Zuweisungsoperator = auf:</p>
<pre><code>int i = 5;
</code></pre>
<p>Wie meine letzten beiden Threads <a href="http://www.c-plusplus.net/forum/316891" rel="nofollow">hier</a> und <a href="http://www.c-plusplus.net/forum/316751" rel="nofollow">dort</a> gezeigt haben, wird es (für mich) abgefahren, wenn ich Speicher auf dem Heap anfordere und gleichzeitig einen (Kopier?) Konstruktor aufrufe!</p>
<p>Nur warum?!? <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>
<p>Einen Teil der Problematik verstehe ich so: Auf dem Heap wurde Speicher mittels <code>new</code> angefordert und die Adresse in einem Pointer <code>p1</code> gespeichert. Nun möchte man die Adresse weitergeben, d.h. ein Objekt erzeugt sich seinen eigenen Pointer <code>p2</code> und übernimmt die Adresse.<br />
Jetzt haben wir schon zwei Pointer, die auf den Heap zeigen. Ergo die Frage: Wer ist jetzt dafür verantwortlich, dass der Heap wieder freigegeben wird?</p>
<p>Zum Einen hat <code>p1</code> seinen Zweck erfüllt, nachdem er die Adresse weitergeben hat und könnte ein <code>delete</code> folgen lassen. Dann wird <code>p2</code> allerdings zum dangling pointer.<br />
Oder wir nehmen <code>p2</code> in die Verantwortung zur Freigabe des Speicherbereichs. Wenn <code>p1</code> aber anschließend den Speicher freigeben möchte, dann ist dies bereits geschehen!</p>
<p>Im <a href="http://www.amazon.de/C-Primer-Stanley-B-Lippman/dp/0201721481/ref=sr_1_2?ie=UTF8&amp;qid=1371048343&amp;sr=8-2&amp;keywords=c%2B%2B+primer" rel="nofollow">Primer</a> habe ich gelesen, dass es eine Art <em>Smart Pointer</em> gibt. Das ist eine Klasse, die mitzählt, wie oft ein Pointer auf einen Speicherbereich zeigt und erst dann <code>delete</code> zulässt, wenn es wirklich der letzte Pointer ist.</p>
<p>Umgekehrt gibt es nun scheinbar auch diesen Kopier-, Zuweisungs- und Move Konstruktor, von denen ich den Sinn bzw. genauer den Unterschied immer noch nicht genau verstanden habe.<br />
Gerade im Zusammenhang mit der Weitergabe von Adressen verstehe ich Kopieren nicht so recht. Wenn Objekt <code>O1</code> die Adresse auf ein anderes Objekt <code>O2</code> bekommt, dann muss ich <code>O2</code> nicht mehr kopieren. Falls <code>O1</code> alleiniger Besitzer sein soll (was auch immer das heißt), muss ich lediglich dafür sorgen, dass sonst kein Pointer (eines anderen Objekts) auf <code>O2</code> zeigt.</p>
<p>Unter Kopieren kann ich mir vorstellen, dass ich zunächst Speicher bereitstelle und diesen dann mit dem Inhalt des gewünschten Objekts fülle. Nur warum? Hat das etwas mit den Schlagwörtern Instanz oder Kapselung zu tun? Oder mit dem Vergleich zwischen Stack und Heap, weil ich Objekte von dem einen zum anderen kopieren möchte, weil der ist ganz viel toller ...<br />
... und da hört es einfach bei mir auf was die Hintergründe sind. Ich würde einfach gerne die Motivation besser verstehen, auf dass diese r- und lvalues und tollen feature der move-semantic mit Leben gefüllt werden.</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317555/constructor-copy-constructor-und-move-semantic</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 14:21:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317555.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Jun 2013 15:01:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to constructor, copy constructor und move semantic on Wed, 12 Jun 2013 15:01:14 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>nachdem ich von euch zuletzt über die Regeln der Drei gebrieft wurde, möchte ich das ganze gerne auch verstehen.</p>
<p>Meine Problem ist bisher, dass ich das ... Problem noch nicht recht verstehe.</p>
<p>Nach meinem bisherigen Verständnis sind die ersten Schlagwörter dazu Pointer und Heap:<br />
Wenn ein Programm an mehreren Stellen ein Objekt benötigt, dann genügt es zu wissen wie dieses Objekt erreicht werden kann, d.h. es muss lediglich die Adresse weitergegeben werden.<br />
Meist kommt in Verbindung mit Pointern dann <code>new</code> und <code>delete</code> , d.h. ein Objekt wird zur Laufzeit auf dem Heap initialisiert und der Pointer zeigt nun auf eine Adresse auf dem Heap.<br />
Nun gibt es mehrere unglückliche Varianten, dass z.B. der Speicher auf dem Heap wieder freigegeben wird und der Pointer bei späterer Verwendung dummerweise ins Leere zeigt (dangling pointer?). Oder umgekehrt, dass der Pointer eine neue Adresse bekommt und damit der Inhalt der vorherigen Adresse nicht mehr zugänglich ist (garbage).</p>
<p>Der nächste Level scheint dann erreicht zu werden, wenn es um (Kopier?) Konstruktoren und Zuweisung geht. Der Konstruktor wird meist im Zusammenhang mit Klassen genannt, aber eigentlich ruft eine implizite Initialisierung schon einen Konstruktor auf:</p>
<pre><code>int i(5);
</code></pre>
<p>Und genauso ruft eine explizite Initialisierung den Zuweisungsoperator = auf:</p>
<pre><code>int i = 5;
</code></pre>
<p>Wie meine letzten beiden Threads <a href="http://www.c-plusplus.net/forum/316891" rel="nofollow">hier</a> und <a href="http://www.c-plusplus.net/forum/316751" rel="nofollow">dort</a> gezeigt haben, wird es (für mich) abgefahren, wenn ich Speicher auf dem Heap anfordere und gleichzeitig einen (Kopier?) Konstruktor aufrufe!</p>
<p>Nur warum?!? <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>
<p>Einen Teil der Problematik verstehe ich so: Auf dem Heap wurde Speicher mittels <code>new</code> angefordert und die Adresse in einem Pointer <code>p1</code> gespeichert. Nun möchte man die Adresse weitergeben, d.h. ein Objekt erzeugt sich seinen eigenen Pointer <code>p2</code> und übernimmt die Adresse.<br />
Jetzt haben wir schon zwei Pointer, die auf den Heap zeigen. Ergo die Frage: Wer ist jetzt dafür verantwortlich, dass der Heap wieder freigegeben wird?</p>
<p>Zum Einen hat <code>p1</code> seinen Zweck erfüllt, nachdem er die Adresse weitergeben hat und könnte ein <code>delete</code> folgen lassen. Dann wird <code>p2</code> allerdings zum dangling pointer.<br />
Oder wir nehmen <code>p2</code> in die Verantwortung zur Freigabe des Speicherbereichs. Wenn <code>p1</code> aber anschließend den Speicher freigeben möchte, dann ist dies bereits geschehen!</p>
<p>Im <a href="http://www.amazon.de/C-Primer-Stanley-B-Lippman/dp/0201721481/ref=sr_1_2?ie=UTF8&amp;qid=1371048343&amp;sr=8-2&amp;keywords=c%2B%2B+primer" rel="nofollow">Primer</a> habe ich gelesen, dass es eine Art <em>Smart Pointer</em> gibt. Das ist eine Klasse, die mitzählt, wie oft ein Pointer auf einen Speicherbereich zeigt und erst dann <code>delete</code> zulässt, wenn es wirklich der letzte Pointer ist.</p>
<p>Umgekehrt gibt es nun scheinbar auch diesen Kopier-, Zuweisungs- und Move Konstruktor, von denen ich den Sinn bzw. genauer den Unterschied immer noch nicht genau verstanden habe.<br />
Gerade im Zusammenhang mit der Weitergabe von Adressen verstehe ich Kopieren nicht so recht. Wenn Objekt <code>O1</code> die Adresse auf ein anderes Objekt <code>O2</code> bekommt, dann muss ich <code>O2</code> nicht mehr kopieren. Falls <code>O1</code> alleiniger Besitzer sein soll (was auch immer das heißt), muss ich lediglich dafür sorgen, dass sonst kein Pointer (eines anderen Objekts) auf <code>O2</code> zeigt.</p>
<p>Unter Kopieren kann ich mir vorstellen, dass ich zunächst Speicher bereitstelle und diesen dann mit dem Inhalt des gewünschten Objekts fülle. Nur warum? Hat das etwas mit den Schlagwörtern Instanz oder Kapselung zu tun? Oder mit dem Vergleich zwischen Stack und Heap, weil ich Objekte von dem einen zum anderen kopieren möchte, weil der ist ganz viel toller ...<br />
... und da hört es einfach bei mir auf was die Hintergründe sind. Ich würde einfach gerne die Motivation besser verstehen, auf dass diese r- und lvalues und tollen feature der move-semantic mit Leben gefüllt werden.</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330622</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 12 Jun 2013 15:01:14 GMT</pubDate></item><item><title><![CDATA[Reply to constructor, copy constructor und move semantic on Wed, 12 Jun 2013 16:09:07 GMT]]></title><description><![CDATA[<p>Die Dreierregel besagt ja einfach, dass du höchst wahrscheinlich alle 3 implementieren musst, sobald du einen implementierst. Was Heap und Pointer damit zu tun haben, verstehe ich nicht. Was du wohl meinst ist, dass du die 3 brauchst, wenn du bestimmte Ressourcen selbst verwalten <code>musst</code> .</p>
<p><strong>Eine einfache Faustregel:</strong><br />
Du willst new/delete <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Du brauchst einen Smart-Pointer.<br />
Du willst new[]/delete[] <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Du brauchst std::vector.</p>
<p><strong>Wann brauchst du einen Smart-Pointer?</strong><br />
Den brauchst du, wenn du wenn ein Objekt über den Scope hinaus am Leben erhalten c]musst[/c].</p>
<p><strong>Wann brauchst du std::vector?</strong><br />
Den brauchst du, wenn die Größe des Arrays erst zur Programmlaufzeit bekannt wird.</p>
<p>Wenn du dies alles beachtest, brauchst du dir über viele Dinge keine Gedanken/Sorgen (die du aktuell noch hast) mehr machen, da sie dir C++ abnimmt.</p>
<p>built-in Typen (int, float, double, bool...) haben keinen Konstruktor, auch wenn es mit der ()-Schreibweise den Anschein hat. int <code>i=5 und int i(5)</code> ist praktisch das Gleiche (unter bestimmten Bedingungen gibt es kleine Unterschiede).</p>
<p>Ansonsten, ja, mit new forderst du Speicher vom Freispreicher (meinst Heap genannt) an. Der Smart-Pointer ist dann dein treuer Gefährte, der den Speicher selbständig wieder freigibt. Es gibt mehrere verschiedene Smart-Pointer. Abhängig von der Situation, nimmst du den einen oder anderen. Soll z.B. ein Objekt geteilt werden, nimmst du den shared-Pointer (mehrere Pointer besitzen dann das Objekt). Soll es nicht geteilt werden, nimmst du den unique-Pointer (immer nur ein Pointer besitzt das Objekt).</p>
<p>Ich glaube, du denkst viel zu kompliziert, und solltest mal von den Adressen wegkommen. Ein Konstruktor wird immer dann benötigt, wenn etwas erschaffen werden muss. Beim Kopie-Konstruktor bedeutet das also, etwas Neues wird mittels eines bereits existierenden Objekts erschaffen. Ein Kopie-Konstruktor macht also einfach eine Kopie. Was da unter der Haube abläuft, ist doch ziemlich egal. Du musst doch nur wissen, dass du nun eine Kopie hast, ganz einfach. Wie du nun auf Instanz und Kapselung kommst, kann ich auch nicht nachvollziehen. In C++ wird alles, was Speicher belegt, als Objekt bezeichnet (außer Funktionen). Man sagt Instanz, damit man weiß, es handelt sich um ein Objekt einer Klasse. Kapselung heißt einfach, du steckst etwas in eine Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330639</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Wed, 12 Jun 2013 16:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to constructor, copy constructor und move semantic on Wed, 12 Jun 2013 16:20:06 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p><strong>Wann brauchst du einen Smart-Pointer?</strong><br />
Den brauchst du, wenn du wenn ein Objekt über den Scope hinaus am Leben erhalten <strong>musst</strong></p>
</blockquote>
<p>Gilt seit C++11 nicht mehr.</p>
<p>Q: Willst du ein Objekt über die Scopegrenzen am Leben erhalten?<br />
A: Nein =&gt; Stackobject</p>
<p>Q: Muss das Objekt polymorph sein?<br />
A: Ja =&gt; unique_ptr</p>
<p>Q: Wird die Resource von mehreren Objekten besessen<br />
A: Nein =&gt;<br />
    Q: Ist die Move-Operation potentiell teuer?<br />
    A: Nein =&gt; Stackobjekt + std::move<br />
    A: Ja =&gt; std::unique_ptr<br />
A: Ja =&gt; ist das Objekt immutable ? shared_ptr : throw design_failure</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330640</guid><dc:creator><![CDATA[ruleofdumb]]></dc:creator><pubDate>Wed, 12 Jun 2013 16:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to constructor, copy constructor und move semantic on Wed, 12 Jun 2013 16:58:49 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>und der Pointer zeigt nun auf eine Adresse auf dem Heap.</p>
</blockquote>
<p>Die Adresse steht nicht im Heap, sondern ist in der Zeigervariablen gespeichert.</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Oder umgekehrt, dass der Pointer eine neue Adresse bekommt und damit der Inhalt der vorherigen Adresse nicht mehr zugänglich ist (garbage).</p>
</blockquote>
<p>Das würde man Leck (leak) nennen.</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Der nächste Level scheint dann erreicht zu werden, wenn es um (Kopier?) Konstruktoren und Zuweisung geht. Der Konstruktor wird meist im Zusammenhang mit Klassen genannt, aber eigentlich ruft eine implizite Initialisierung schon einen Konstruktor auf:</p>
<pre><code>int i(5);
</code></pre>
<p>Und genauso ruft eine explizite Initialisierung den Zuweisungsoperator = auf:</p>
<pre><code>int i = 5;
</code></pre>
</blockquote>
<p>Der Schluss ist falsch. Die letzte Codezeile ruft nicht den Zuweisungsoperator aus; denn eine Zuweisung ist etwas anderes als eine Initialisierung. Der Unterschied: Bei der Zuweisung gibt es die Variable/das Objekt schon vorher. Bei einer Initialisierung nicht. Die Initialisierungssyntax mit dem Gleichzeichen nennt sich &quot;Kopier-Initialisierung&quot;. Das andere mit der Klammer ist eine &quot;direkte Initialisierung&quot;. Der Unterschied: Für die Kopierinitialisierung wird kein mit <em>explicit</em> markierter Konstruktor aufgerufen. Das Initialisieren von Funktionsparametern ist übrigens auch eine Kopierinitialisierung.</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Einen Teil der Problematik verstehe ich so: Auf dem Heap wurde Speicher mittels <code>new</code> angefordert und die Adresse in einem Pointer <code>p1</code> gespeichert. Nun möchte man die Adresse weitergeben, d.h. ein Objekt erzeugt sich seinen eigenen Pointer <code>p2</code> und übernimmt die Adresse.<br />
Jetzt haben wir schon zwei Pointer, die auf den Heap zeigen. Ergo die Frage: Wer ist jetzt dafür verantwortlich, dass der Heap wieder freigegeben wird?</p>
</blockquote>
<p>Das schreibt dir keiner vor, wer dafür verantwortlich ist. Diese Frage musst du für Dich beim Design beantworten. Man hört aber immer wieder und immer lauter, dass nackte/rohe Zeiger nicht verwendet werden sollten, wenn man sich darin eine Adresse eines Objekts merkt, die man dann irgendwann wieder manuell löschen müsste. Nackte/rohe Zeiger sind nicht per se schlecht. Es gibt immer noch Einsatzzwecke. Allerdings klingt das in deinem Fall so, als hätte man lieber einen &quot;besitzergreifenden&quot; Zeiger verwenden sollen. Den gibt's in zwei Varianten: unique_ptr und shared_ptr. Wenn Du dir nicht sicher bist, welchen du von denen brauchst, probier es erst mit einem unique_ptr. Der ist &quot;schlanker&quot;, aber auch unkopierbar. Dafür kann man ihn &quot;moven&quot;. In deinem Fall könnte man also folgendes machen:</p>
<pre><code class="language-cpp">unique_ptr&lt;int&gt; up (new int(23));
int* q = up.get();
</code></pre>
<p>up ist der Zeiger, der sich für das Objekt &quot;verantwortlich fühlt&quot;, er ist der &quot;Besitzer&quot;. Und q zeigt einfach nur auf das Objekt. Hier ist kein delete notwendig; denn der unique_ptr löscht das Objekt wieder ganz automatisch (unique ownership). Wenn Du dich aber nicht ganz entscheiden kannst, wer von den beiden Zeigern der &quot;Besitzer&quot; sein soll dann könntest du einen shared_ptr verwenden (shared ownership):</p>
<pre><code class="language-cpp">auto sp = std::make_shared&lt;int&gt;(23);
auto q = sp;
</code></pre>
<p>Hier sind beide Zeiger vom Typ shared_ptr&lt;int&gt; und beide teilen sich den Besitz. Der letzte löscht das Objekt. Bei shared_ptr haste etwas mehr Overhead dabei, weil irgendwo ja gespeichert werden muss, wieviele shared_ptr sich noch auf das Objekt beziehen. (Dann gibt's auch noch weak_ptr, aber dazu sag ich erst mal nichts).</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Zum Einen hat <code>p1</code> seinen Zweck erfüllt, nachdem er die Adresse weitergeben hat und könnte ein <code>delete</code> folgen lassen. Dann wird <code>p2</code> allerdings zum dangling pointer.<br />
Oder wir nehmen <code>p2</code> in die Verantwortung zur Freigabe des Speicherbereichs. Wenn <code>p1</code> aber anschließend den Speicher freigeben möchte, dann ist dies bereits geschehen!</p>
</blockquote>
<p>Wenn du p1 nicht mehr brauchst, nachdem du die Adresse nach p2 kopiert hast, dann könntest du als Typ für beide unique_ptr verwenden und dir das delete sparen.</p>
<p>Wie auch immer: Es kommt auf Dein Design an. Im Notfall: shared_ptr. Meist geht es auch anders. Und öfter als man denkt, kann man komplett auf Zeiger verzichten, sowohl die &quot;dummen&quot; als auch die &quot;smarten&quot;. <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>Klaus82 schrieb:</p>
<blockquote>
<p>Im <a href="http://www.amazon.de/C-Primer-Stanley-B-Lippman/dp/0201721481/ref=sr_1_2?ie=UTF8&amp;qid=1371048343&amp;sr=8-2&amp;keywords=c%2B%2B+primer" rel="nofollow">Primer</a> habe ich gelesen, dass es eine Art <em>Smart Pointer</em> gibt.</p>
</blockquote>
<p>Ja, unique_ptr&lt;T,D&gt; und shared_ptr&lt;T&gt; würde man als smart pointer-Klassen bezeichnen.</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Umgekehrt gibt es nun scheinbar auch diesen Kopier-, Zuweisungs- und Move Konstruktor, von denen ich den Sinn bzw. genauer den Unterschied immer noch nicht genau verstanden habe.</p>
</blockquote>
<p>Das ist dann praktisch, wenn der &quot;logische Zustand&quot; oder die &quot;logischen Teile&quot; des Objekts sich in Wirklichkeit auf mehrere Speicherbereiche verteilt. Siehe std::vector. Logisch gesehen, ist das ein dynamisches Array. Physikalisch gesehen, besteht ein vector-Objekt aus ein paar Zeigern und verweist nur auf Freispeicher (die Vektor-Elemente). In genau solchen Situationen kann man einen Move-Konstructor dazu verwenden, so ein vector&lt;T&gt;-Objekt von einem Ort zum anderen Ort umziehen zu lassen, ohne dass man all seine Elemente kopieren müsste, weil die ja eh nicht direkt im vector-Objekt gespeichert werden, sondern nur &quot;logisch&quot; dazugehören.</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Unter Kopieren kann ich mir vorstellen, dass ich zunächst Speicher bereitstelle und diesen dann mit dem Inhalt des gewünschten Objekts fülle. Nur warum? Hat das etwas mit den Schlagwörtern Instanz oder Kapselung zu tun?</p>
</blockquote>
<p>Das machst du für ints und doubles ständig:</p>
<pre><code class="language-cpp">double quadriere(double x)
{
   return x*x;
}

int main()
{
  double a = 42;
  double b = quadriere(x);
}
</code></pre>
<p>Hier werden doubles auch munter kopiert. Und du musst hier nix mit Zeigern machen. Und das will man auch meist mit komplizierteren Datenstrukturen hinbekommen.</p>
<p>Schau dir mal einen der Talks von Scot Meyers' zum Thema an. Da wird das schön illustriert, was bei Move-Semantik (typischerweise im Zusammenhang eines Vektors) passiert und wann das praktisch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330646</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 12 Jun 2013 16:58:49 GMT</pubDate></item></channel></rss>