<?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[Default Ctor ausreichend bei arrays&#x2F;Zeigern?]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code:</p>
<pre><code class="language-cpp">struct foo {
   char p[30];
   foo() {
      strcpy(p, &quot;hallo&quot;);
   }	
};

class clas {
public:
   foo myFoo;
   foo method() { return myFoo; }	
};
</code></pre>
<p>Wenn ich method() aufrufe, wird denke ich ja mal der Default Ctor von foo aufgerufen, der Elementweise kopiert. Bei ints usw funktioniert das natürlich, aber klappt das auch bei Arrays wie hier p?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192325/default-ctor-ausreichend-bei-arrays-zeigern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 09:34:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192325.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Sep 2007 23:25:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Wed, 12 Sep 2007 23:25:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code:</p>
<pre><code class="language-cpp">struct foo {
   char p[30];
   foo() {
      strcpy(p, &quot;hallo&quot;);
   }	
};

class clas {
public:
   foo myFoo;
   foo method() { return myFoo; }	
};
</code></pre>
<p>Wenn ich method() aufrufe, wird denke ich ja mal der Default Ctor von foo aufgerufen, der Elementweise kopiert. Bei ints usw funktioniert das natürlich, aber klappt das auch bei Arrays wie hier p?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364351</guid><dc:creator><![CDATA[klammeraffe]]></dc:creator><pubDate>Wed, 12 Sep 2007 23:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 00:07:38 GMT]]></title><description><![CDATA[<p>Warum probierst du's nicht einfach aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364355</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 13 Sep 2007 00:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 00:13:45 GMT]]></title><description><![CDATA[<p>Habe ich, aber ich verstehe das Ergebnis nicht.<br />
Wenn ich das mache:</p>
<pre><code class="language-cpp">clas c;

foo f = c.method();
</code></pre>
<p>dann steht in c.myFoo.p und f.p &quot;hallo&quot;, aber sie zeigen auf unterschiedliche Adressen. Das raff ich absolut nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364356</guid><dc:creator><![CDATA[klammeraffe]]></dc:creator><pubDate>Thu, 13 Sep 2007 00:13:45 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 05:14:05 GMT]]></title><description><![CDATA[<p>p ist ein Array, kein Zeiger, daher zeigt p nicht auf irgendwas. Daraus folgt, den Standardregeln von C++ folgend, dass jede Instanz von foo sein eigenes Array hat, welches auch durch die Default-Copy-Operationen ordentlich kopiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364380</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Sep 2007 05:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 07:16:32 GMT]]></title><description><![CDATA[<p>klammeraffe schrieb:</p>
<blockquote>
<p>Habe ich, aber ich verstehe das Ergebnis nicht.<br />
Wenn ich das mache:</p>
<pre><code class="language-cpp">clas c;

foo f = c.method();
</code></pre>
<p>dann steht in c.myFoo.p und f.p &quot;hallo&quot;, aber sie zeigen auf unterschiedliche Adressen. Das raff ich absolut nicht.</p>
</blockquote>
<p>Das überrascht doch wohl nicht wirklich bei</p>
<p>klammeraffe schrieb:</p>
<blockquote>
<pre><code class="language-cpp">foo method() { return myFoo; }
</code></pre>
</blockquote>
<p>oder ?</p>
<p>Ist doch so wie überall: Rückgabe per <strong>Kopie</strong> !<br />
Und wenn ich ein Array kopiere, bekomme ich ein anderes Array mit denselben Werten (erstmal).... das natürlich auch woanders im Speicher liegt.</p>
<p>Erst Recht HIER, wo es sich ja nicht einmal um eine Zuweisung, sondern eine Initialisierung des neuen foo-Objekts f handelt (das natürlich da liegt, wo der COmpiler es eben gerade hinlegt)....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364421</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 12:45:09 GMT]]></title><description><![CDATA[<p>Wie stellt man sich dann am besten den vom Compiler erstellten Default CopyCtor vor?<br />
Ich dachte immer er sieht so aus:</p>
<pre><code class="language-cpp">foo(const foo&amp; f) {
   a = f.a;
   b = f.b;  // usw
   // p ist pointer, arr ist array
   // aber wie muss ich mir das bei p und arr vorstellen?
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1364638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364638</guid><dc:creator><![CDATA[klammeraffe]]></dc:creator><pubDate>Thu, 13 Sep 2007 12:45:09 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 13:04:56 GMT]]></title><description><![CDATA[<p>klammeraffe schrieb:</p>
<blockquote>
<p>Wie stellt man sich dann am besten den vom Compiler erstellten Default CopyCtor vor?<br />
Ich dachte immer er sieht so aus:</p>
<pre><code class="language-cpp">foo(const foo&amp; f) {
   a = f.a;
   b = f.b;  // usw
   // p ist pointer, arr ist array
   // aber wie muss ich mir das bei p und arr vorstellen?
}
</code></pre>
</blockquote>
<p>Das Kopieren von Pointern ist hier kein Spezialfall, für das Kopieren von Arrays gibt es dagegen keine Möglichkeit, das exakt gleiche Verhalten explizit zu bewirken. Arrays werden elementweise kopiert:</p>
<pre><code class="language-cpp">struct Foo
{
    T arr[10];
    Foo(const Foo&amp; other)
    {
        // default-copyctor sinngemäß so:
        std::uninitialized_copy(other.arr,other.arr+10,arr);
        // wenn T selbst ein array ist, müssen wir dessen Elemente kopieren und so weiter
        // (wir können nur Klassen und skalare Typen explizit kopieren)
    }
};
</code></pre>
<p>Diesen Vorgang müsste man in der Initialisierungsliste erledigen, und das ist syntaktisch unmöglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364652</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 13 Sep 2007 13:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to Default Ctor ausreichend bei arrays&#x2F;Zeigern? on Thu, 13 Sep 2007 13:16:59 GMT]]></title><description><![CDATA[<p>klammeraffe schrieb:</p>
<blockquote>
<p>Wie stellt man sich dann am besten den vom Compiler erstellten Default CopyCtor vor?<br />
Ich dachte immer er sieht so aus:</p>
<pre><code class="language-cpp">foo(const foo&amp; f) {
   a = f.a;
   b = f.b;  // usw
   // p ist pointer, arr ist array
   // aber wie muss ich mir das bei p und arr vorstellen?
}
</code></pre>
</blockquote>
<p>Ja, so sieht das auch aus... und es erklärt auch deine Problematik. Der Standard-Kopierkonstruktor macht für ALLE Elemente (unabhängig davon was sie sind) eine Wertkopie, nicht desto trotz sind es eigenständige Elemente (die dann nur den gleichen Wert haben). Ein Array ist vom Verständnis her ein Element wie jedes andere (auch wenn wie camper schon geschrieben hat, eine andere Kopieform verwendet wird; Sprich der Inhalt wird kopiert, dennoch sind es unterschiedliche Arrays).</p>
<p>Sofern man Pointer in einer Klasse hat wird es spannend, sofern diese auch in der Klasse angelegt und gelöscht werden. Der Wert eines Pointers ist ja schließlich die Adresse (und nur die wird kopiert), nicht der Inhalt, auf den er zeigt. Daher überschreibt man in solchen Fällen den Kopierkonstruktor um in dem Moment z.B. eine eigene Kopie des Speicherbereiches zu machen.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364660</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 13 Sep 2007 13:16:59 GMT</pubDate></item></channel></rss>