<?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[Shallow Copy]]></title><description><![CDATA[<p>Hallo,</p>
<p>kurze Frage: Ist der default copy constructor ausreichend, wenn ich char* Attribute in einer Klasse habe, oder muss ich dafür einen extra copy constructor schreiben (siehe Beispiel)? Danke schon mal für die Antwort.</p>
<pre><code>class X
{
  public:
    X(char* s) : str(s) {};
    virtual ~X() {};
    // ... weitere Methoden ...
  private:
    char* str;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/128617/shallow-copy</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 18:23:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128617.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Dec 2005 15:17:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:17:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>kurze Frage: Ist der default copy constructor ausreichend, wenn ich char* Attribute in einer Klasse habe, oder muss ich dafür einen extra copy constructor schreiben (siehe Beispiel)? Danke schon mal für die Antwort.</p>
<pre><code>class X
{
  public:
    X(char* s) : str(s) {};
    virtual ~X() {};
    // ... weitere Methoden ...
  private:
    char* str;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/935024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935024</guid><dc:creator><![CDATA[Hanebuechen]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:23:42 GMT]]></title><description><![CDATA[<p>Das kommt ganz darauf an, wie du diese char* verwenden willst. Wenn alle Kopien eines Objekts den selben Speicher verwenden sollen, reicht der Standard-Copy-Ctor. Aber normalerweise benötigt man einen eigenen Copy-Ctor dafür:</p>
<pre><code class="language-cpp">class X
{
public:
  X(int size):str(new char[size]),len(size) {}
  X(const X&amp; other):str(new char[other.len]),len(other.len)
  {
    strcpy(str,other.str);
  }
  ~X() {delete[] str;}
private:
  char* str;
  int len;
};
</code></pre>
<p>(und am besten spendierst du der Klasse auch noch einen Zuweisungsoperator, um ganz sicher zu gehen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935030</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:24:02 GMT]]></title><description><![CDATA[<p>Wenn mit den String-Zeigern sonst nichts gemacht wird reicht das so. Wenn im Default Dtor (oder irgendwo im Kontext der im Beispiel nicht zu erkennen ist) allerdings Speicher der char* freigegeben würde, müsste bei Zuweisung/Kopie auch entsprechendes geschehen.</p>
<p>Oder nimm std::string um auf der sicheren Seite zu sein:</p>
<pre><code class="language-cpp">class X
{
  public:
    X(const std::string&amp; s) : str(s) {}
    virtual ~X() {}
    // ... weitere Methoden ...
  private:
    std::string str;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/935031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935031</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:24:20 GMT]]></title><description><![CDATA[<p>Hm auch wenn ich nicht genau weiß was eine Shallow copy genau sein soll..<br />
In dem Fall, dass du unabhängig von der anderen Instanz sein willst musst du auf jeden Fall einen cctor selber machen. Also Speicher holen und den string kopieren. Ich würde sowieso std::string verwenden, dann hast du das Problem nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935033</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:26:47 GMT]]></title><description><![CDATA[<p>@templäd:</p>
<p>Ne Shallow Copy hast i.A., wenn nur ein Zeiger kopiert wird. Das Gegenteil kopiert eben die Inhalte aller Zeiger und heisst üblicherweise Deep Copy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935037</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:31:36 GMT]]></title><description><![CDATA[<p>Shallow copy kommt dann wohl eher aus der Welt mit standardmäßig referenzgezählten Zeigern. Da mir in c++ nicht so viele Anwendungsfälle begegnet sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935046</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:33:40 GMT]]></title><description><![CDATA[<p>templäd schrieb:</p>
<blockquote>
<p>Shallow copy kommt dann wohl eher aus der Welt mit standardmäßig referenzgezählten Zeigern.</p>
</blockquote>
<p>Shallow copy ist vor allem das, was dir der Compiler von sich aus bereitstellt, wenn du keine eigenen Methoden für die Kopie schreibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935048</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:34:30 GMT]]></title><description><![CDATA[<p>IMHO ist die Kopie jeder bessere String-Klasse eine Shallow-Copy mit Copy-On-Write. Jedenfalls gibts das für QT, MFC und sicherlich auch STL (oder?)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935049</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:34:30 GMT</pubDate></item><item><title><![CDATA[Reply to Shallow Copy on Mon, 05 Dec 2005 15:55:18 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>IMHO ist die Kopie jeder bessere String-Klasse eine Shallow-Copy mit Copy-On-Write. Jedenfalls gibts das für QT, MFC und sicherlich auch STL (oder?)...</p>
</blockquote>
<p>Copy-On-Write für Strings ist ein ganz gewaltiger Krampf. Wenn man sich die Entwicklung jener in der STL angeschaut hat, um eine referenzgezählte Implementation zu ermöglichen, dann weiß man, welches Ungeheuer man sich einbrockt, falls man die selbst implementieren will.</p>
<p>Mal ein ganz simples Beispiel:</p>
<pre><code class="language-cpp">std::string s1 = &quot;hallo&quot;;
char&amp; c = s1[0];
std::string s2 = s1; /// Es MUSS kopiert werden, da eine Referenz auf s1 bestehen könnte. s1 kann hier garnicht invalidiert werden, da er im Konstruktor konstant ist
c = 'H'; // wir wollen ja schließlich nicht, dass s2 geändert wird
</code></pre>
<p>Hebelt das nicht schon fast alle Fälle für COW aus? Konstante Strings wären eine Ausnahme, aber das war's. Außerdem ist das ständige Referenzgezähle im Multithreading-Einsatz der absolute Overkill. Von &quot;besser&quot; kann da nicht so wirklich die Rede sein <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/935075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935075</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 05 Dec 2005 15:55:18 GMT</pubDate></item></channel></rss>