<?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 Konstruktoren und = operator]]></title><description><![CDATA[<p>moin<br />
Warum darf ich nicht folgendes machen:</p>
<pre><code class="language-cpp">TKlasse::TKlasse(const TKlasse&amp; ref) //Copy Konstructor
{
  *this = ref;
}

TKlasse&amp; TKlasse::operator = (const TKlasse&amp; ref)  
{ 
  [...]//irgendwelche zugriffe auf private Object Variablen um zu kopieren
  return *this;
}
</code></pre>
<p>Der Code funktionier zwar soll aber nicht immer gehen.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/145406/copy-konstruktoren-und-operator</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 04:16:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145406.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Apr 2006 15:45:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Thu, 27 Apr 2006 16:37:44 GMT]]></title><description><![CDATA[<p>moin<br />
Warum darf ich nicht folgendes machen:</p>
<pre><code class="language-cpp">TKlasse::TKlasse(const TKlasse&amp; ref) //Copy Konstructor
{
  *this = ref;
}

TKlasse&amp; TKlasse::operator = (const TKlasse&amp; ref)  
{ 
  [...]//irgendwelche zugriffe auf private Object Variablen um zu kopieren
  return *this;
}
</code></pre>
<p>Der Code funktionier zwar soll aber nicht immer gehen.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046514</guid><dc:creator><![CDATA[Gandalfus]]></dc:creator><pubDate>Thu, 27 Apr 2006 16:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Thu, 27 Apr 2006 22:53:46 GMT]]></title><description><![CDATA[<p>Konstructor haben seit C98 KEINEN rueckgabe type!<br />
Gilt auch fuer den destructor...</p>
<p>Fuer den operator=() why not?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046803</guid><dc:creator><![CDATA[xGhost]]></dc:creator><pubDate>Thu, 27 Apr 2006 22:53:46 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Fri, 28 Apr 2006 05:44:31 GMT]]></title><description><![CDATA[<p>Hi!</p>
<pre><code class="language-cpp">TKlasse&amp; TKlasse::operator = (const TKlasse&amp; ref)   
 { 
   [...]//irgendwelche zugriffe auf private Object Variablen um zu kopieren 
   return *this; 
 }
</code></pre>
<p>Warum darfst du das nicht machen? Wer sagt das? Der Compiler? Wenn ja, würde ich gern mal wissen was genau er zu beanstanden hat!</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046828</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 28 Apr 2006 05:44:31 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Fri, 28 Apr 2006 06:36:00 GMT]]></title><description><![CDATA[<p>Gandalfus schrieb:</p>
<blockquote>
<p>moin<br />
Warum darf ich nicht folgendes machen:</p>
<pre><code class="language-cpp">TKlasse::TKlasse(const TKlasse&amp; ref) //Copy Konstructor
{
  *this = ref;
}
</code></pre>
</blockquote>
<p>weil es dein programm tötet. du rufst den op= nit einem linken argument auf, das gar nicht initialisiert ist (das noch gar kein lebendes objekt ist).<br />
in *this=ref wird zum beispiel vorher was gelöscht. der einfachheit halber mach ich mal den op= ohne copy&amp;swap.</p>
<pre><code class="language-cpp">UString::UString(const UString&amp; ref) //Copy Konstructor
{
  *this = ref;
}
UString&amp; operator=(UString&amp; ref){
   if(&amp;ref==this) return *this;
   delete[] mem;//kill!
   mem=new char[strlen(ref.mem)+1];
   strcpy(mem,ref.mem);
   return *string;
}
</code></pre>
<blockquote>
<pre><code class="language-cpp">TKlasse&amp; TKlasse::operator = (const TKlasse&amp; ref)  
{ 
  [...]//irgendwelche zugriffe auf private Object Variablen um zu kopieren
  return *this;
}
</code></pre>
<p>Der Code funktionier zwar soll aber nicht immer gehen.</p>
</blockquote>
<p>der geht immer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046846</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 28 Apr 2006 06:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Fri, 28 Apr 2006 08:06:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">UString&amp; operator=(UString&amp; ref){
   if(&amp;ref==this) return *this;
   delete[] mem;//kill!
   mem=new char[strlen(ref.mem)+1];
   strcpy(mem,ref.mem);
   return *string;
}
</code></pre>
</blockquote>
<p>Soll das jetzt ein Beispiel dafür sein, wie man es nicht macht oder wie muss ich dich da verstehen?</p>
<p>Ein op= ohne swap sollte dann eher so aussehen:</p>
<pre><code class="language-cpp">UString&amp; operator=(const UString&amp; ref)
{
    char* tmp = new char[strlen(ref.mem)+1];
    strcpy(tmp,ref.mem);
    delete[] mem;//kill!
    mem = tmp;
    return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1046893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046893</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 28 Apr 2006 08:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Fri, 28 Apr 2006 11:53:35 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>weil es dein programm tötet. du rufst den op= nit einem linken argument auf, das gar nicht initialisiert ist (das noch gar kein lebendes objekt ist).</p>
</blockquote>
<p>Wenn ich den Konstruktor auf rufe ist das object doch instanziert. Sonst könnte ich im Konstruktor ja auch nicht auf Object Variablen zugreifen.</p>
<p>Mein Ziel ist dass ich keine redundanten code habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047031</guid><dc:creator><![CDATA[Gandalfus]]></dc:creator><pubDate>Fri, 28 Apr 2006 11:53:35 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Fri, 28 Apr 2006 12:54:34 GMT]]></title><description><![CDATA[<p>Gandalfus schrieb:</p>
<blockquote>
<p>Wenn ich den Konstruktor auf rufe ist das object doch instanziert. Sonst könnte ich im Konstruktor ja auch nicht auf Object Variablen zugreifen.</p>
</blockquote>
<p>falsch. ruf doch mal ne viruelle funktion auf und du wirst sehen, daß dein objekt noch nicht lebt.</p>
<blockquote>
<p>Mein Ziel ist dass ich keine redundanten code habe.</p>
</blockquote>
<p>sag das doch gleich.<br />
benutze copy&amp;swap.</p>
<pre><code class="language-cpp">friend void swap(UString&amp; a,UString&amp; b){
   swap(a.data,b.data);
}
UString&amp; operator=(const UString&amp; ref)
{
    UString tmp(ref);
    swap(*this,tmp);
    return *this;
}
</code></pre>
<p>übrigens steht U für Unfug und ist eine parodie auf dein T.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047071</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 28 Apr 2006 12:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Konstruktoren und = operator on Fri, 28 Apr 2006 13:03:12 GMT]]></title><description><![CDATA[<p>Gandalfus schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>weil es dein programm tötet. du rufst den op= nit einem linken argument auf, das gar nicht initialisiert ist (das noch gar kein lebendes objekt ist).</p>
</blockquote>
<p>Wenn ich den Konstruktor auf rufe ist das object doch instanziert. Sonst könnte ich im Konstruktor ja auch nicht auf Object Variablen zugreifen.</p>
<p>Mein Ziel ist dass ich keine redundanten code habe.</p>
</blockquote>
<p>bei copy-konstruktion wird ein neues objekt initialisiert. beim copy-op= dagegen muss zunächst der alte inhalt des objekts zerstört werden, bevor es als kopie des arguments neu initialisiert wird. und hier liegt das problem: wenn die zerstörung des alten inhalts nicht trivial ist, insbes. bestimmte invarianten erfüllt sein müssen, dann ist es logischerweise nicht möglich, ein objekt, das nicht explizit initialisiert wurde, zu benutzen. was C++ angeht, so ist ein objekt fertig konstruiert, sobald der konstruktor-körper ausgeführt wird, deshalb wird dich der compiler auch niemals an obigem konstrukt hindern. unter logisch-semantischen gesichtspunkten ist es dagegen ein grober fehler. im gegensatz dazu geht copy&amp;swap den umgekehrten weg: hier wird op= mittels des copy-ctors implementiert. redundanz zu vermeiden, ist ein sinnvolles ziel, allerdings in der gegenwärtigen sprache (in abwesenheit von ctor-delegation) ohnehin nicht immer zu vermeiden, insofern sollte es an dieser stelle auch nicht unbedingt top-priorität haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047080</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 28 Apr 2006 13:03:12 GMT</pubDate></item></channel></rss>