<?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[Kopierkonstruktor, Zuweisungsoperator]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab eine Übungsaufgabe aus einem Buch versucht zu lösen. Nun gibt es leider keine Lösungen für diese Aufgabe. Es wäre super wenn ihr mal drüberschauen könntet und mich auf Fehler hinweißt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Dynamic
{
      private:
              char id;
              int value;
              int *arr;
              int arraySize;
              static char uniqueObjId;

      public:
              Dynamic(int val=0, int size = 0);
              Dynamic(const Dynamic&amp; obj);
              ~Dynamic();
              Dynamic&amp; operator=(const Dynamic&amp; rhs);
              int getValue() { return value; }
              int getArraySize() { return arraySize; }
};

char Dynamic::uniqueObjId = 'A';

Dynamic::Dynamic(int val, int size)
{
      value = val;
      arraySize = size;
      arr = new int[arraySize];
      id = uniqueObjId;
      uniqueObjId++;
}

Dynamic::Dynamic(const Dynamic&amp; obj)
{
      value = obj.value;
      arraySize = obj.arraySize;
      arr = new int[arraySize];

      for(int i=0; i&lt;arraySize; i++)
      {
          arr[i] = obj.arr[i];
      }

      id = obj.uniqueObjId;
}

Dynamic::~Dynamic()
{
      delete[] arr;
      arr = NULL;
}

Dynamic&amp; Dynamic::operator=(const Dynamic&amp; rhs)
{
      if(this == &amp;rhs)
         return *this;

      value = rhs.value;
      arraySize = rhs.arraySize;

      for(int i=0; i&lt;arraySize; i++)
      {
          arr[i] = rhs.arr[i];
      } 

      id=rhs.uniqueObjId;

      return *this;
}

Dynamic f(Dynamic obj)
{
      Dynamic localObj(100 + obj.getValue(), obj.getArraySize());
      return localObj;
}

int main()
{
    Dynamic obj1(10,10), obj2;
    obj2 = f(obj1);
    cout &lt;&lt; obj2.getValue() &lt;&lt; endl;

    char dummy;
    cin &gt;&gt; dummy;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/117635/kopierkonstruktor-zuweisungsoperator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 06:22:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/117635.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Aug 2005 16:58:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Tue, 09 Aug 2005 16:58:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab eine Übungsaufgabe aus einem Buch versucht zu lösen. Nun gibt es leider keine Lösungen für diese Aufgabe. Es wäre super wenn ihr mal drüberschauen könntet und mich auf Fehler hinweißt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Dynamic
{
      private:
              char id;
              int value;
              int *arr;
              int arraySize;
              static char uniqueObjId;

      public:
              Dynamic(int val=0, int size = 0);
              Dynamic(const Dynamic&amp; obj);
              ~Dynamic();
              Dynamic&amp; operator=(const Dynamic&amp; rhs);
              int getValue() { return value; }
              int getArraySize() { return arraySize; }
};

char Dynamic::uniqueObjId = 'A';

Dynamic::Dynamic(int val, int size)
{
      value = val;
      arraySize = size;
      arr = new int[arraySize];
      id = uniqueObjId;
      uniqueObjId++;
}

Dynamic::Dynamic(const Dynamic&amp; obj)
{
      value = obj.value;
      arraySize = obj.arraySize;
      arr = new int[arraySize];

      for(int i=0; i&lt;arraySize; i++)
      {
          arr[i] = obj.arr[i];
      }

      id = obj.uniqueObjId;
}

Dynamic::~Dynamic()
{
      delete[] arr;
      arr = NULL;
}

Dynamic&amp; Dynamic::operator=(const Dynamic&amp; rhs)
{
      if(this == &amp;rhs)
         return *this;

      value = rhs.value;
      arraySize = rhs.arraySize;

      for(int i=0; i&lt;arraySize; i++)
      {
          arr[i] = rhs.arr[i];
      } 

      id=rhs.uniqueObjId;

      return *this;
}

Dynamic f(Dynamic obj)
{
      Dynamic localObj(100 + obj.getValue(), obj.getArraySize());
      return localObj;
}

int main()
{
    Dynamic obj1(10,10), obj2;
    obj2 = f(obj1);
    cout &lt;&lt; obj2.getValue() &lt;&lt; endl;

    char dummy;
    cin &gt;&gt; dummy;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/848861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848861</guid><dc:creator><![CDATA[GR_Watto]]></dc:creator><pubDate>Tue, 09 Aug 2005 16:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Tue, 09 Aug 2005 17:20:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">arraySize = rhs.arraySize;
</code></pre>
<p>hier wird arr nicht reallokiert. schlecht wenn rhs.arraySize grösser als der verherige wert von arraySize war...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848876</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 09 Aug 2005 17:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Tue, 09 Aug 2005 19:02:53 GMT]]></title><description><![CDATA[<p>Wie genau ist denn die Aufgabenstellung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848927</guid><dc:creator><![CDATA[BigBoomer]]></dc:creator><pubDate>Tue, 09 Aug 2005 19:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 08:45:18 GMT]]></title><description><![CDATA[<p>was mir so auf anhieb auffaellt :</p>
<pre><code class="language-cpp">Dynamic&amp; operator=(const Dynamic&amp; rhs);
</code></pre>
<p>besser:<br />
const Dynamic&amp; operator=(const Dynamic&amp; rhs);<br />
= operatoren willst ja hoffentlich ned verketten <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>Das mit der uniqueObjId scheint mir rein logisch fragwuerdig ...<br />
warum braucht man die ? iss es richtig, das kopien die gleiche uniqueObjId haben ?<br />
Instanzen selber kann man meist gut ueber ihre Adresse auseinanderhalten <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>
<pre><code class="language-cpp">Dynamic obj1(10,10), obj2;
</code></pre>
<p>obj1 ok, obj2 ? du hasst kein standard Construktor definiert, wie soll sich das genau verhalten ....</p>
<p>dein Hauptproblem iss aber das was camper schreibt ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849155</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 Aug 2005 08:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 09:22:36 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>was mir so auf anhieb auffaellt :</p>
<pre><code class="language-cpp">Dynamic&amp; operator=(const Dynamic&amp; rhs);
</code></pre>
<p>besser:<br />
const Dynamic&amp; operator=(const Dynamic&amp; rhs);<br />
= operatoren willst ja hoffentlich ned verketten <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="🙂"
    /> [/cpp]</p>
</blockquote>
<p>wieso nicht ? welche sicherheit gibt dieses zusätzlich const? im übrigen gibt der operator für built-in typen ebenfalls non-const lvalues zurück.</p>
<blockquote>
<pre><code class="language-cpp">Dynamic obj1(10,10), obj2;
</code></pre>
<p>obj1 ok, obj2 ? du hasst kein standard Construktor definiert, wie soll sich das genau verhalten ....</p>
</blockquote>
<pre><code class="language-cpp">Dynamic(int val=0, int size = 0);
</code></pre>
<p>ist doch ein schöner default konstruktor...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849174</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Aug 2005 09:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 09:54:23 GMT]]></title><description><![CDATA[<blockquote>
<p>Dynamic(int val=0, int size = 0);<br />
ist doch ein schöner default konstruktor...</p>
</blockquote>
<p>Ups, die default-values uebersehen, stimmt</p>
<blockquote>
<p>wieso nicht ? welche sicherheit gibt dieses zusätzlich const? im übrigen gibt der operator für built-in typen ebenfalls non-const lvalues zurück.</p>
</blockquote>
<p>nicht wirklich einen, weil selbst bei der normalen verkettung der compiler das anders aufloesst ....</p>
<p>x = y = z; ist kein problem oder ?</p>
<p>aber:<br />
(x = y) = z;<br />
Was macht das fuern sinn ? woelltest du das compilieren koennen ?</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849210</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 Aug 2005 09:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 17:03:18 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">arraySize = rhs.arraySize;
</code></pre>
<p>hier wird arr nicht reallokiert. schlecht wenn rhs.arraySize grösser als der verherige wert von arraySize war...</p>
</blockquote>
<p>Ich versteh nicht so richtig was mit dieser Zeile nicht in Ordnung ist. Könnt ihr mir das vielleicht ein bißchen genauer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849645</guid><dc:creator><![CDATA[GR_Watto]]></dc:creator><pubDate>Wed, 10 Aug 2005 17:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 17:37:59 GMT]]></title><description><![CDATA[<p>Es ist so wie camper schon geasgt hat. Du gibst arraySize einen neuen wert, änderst aber die grösse von arr nicht. Eigentlich müsstest du arr zuerst freigeben und dann mit der neuen Grösse neu anlegen.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849664</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 10 Aug 2005 17:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 17:52:01 GMT]]></title><description><![CDATA[<p>Wäre das so korrekt?</p>
<pre><code class="language-cpp">Dynamic&amp; Dynamic::operator=(const Dynamic&amp; rhs)
{
      if(this == &amp;rhs)
         return *this;

      value = rhs.value;
      arraySize = rhs.arraySize;

      delete[]arr;
      arr = new int[arraySize];

      for(int i=0; i&lt;arraySize; i++)
      {
          arr[i] = rhs.arr[i];
      } 

      id=rhs.uniqueObjId;

      return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/849673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849673</guid><dc:creator><![CDATA[GR_Watto]]></dc:creator><pubDate>Wed, 10 Aug 2005 17:52:01 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 18:24:21 GMT]]></title><description><![CDATA[<p>So sollte es funktionieren.<br />
Natürlich musst du das array nicht löschen und neu anlegen wenn<br />
rhs.arraySize &lt;= arraySize. Finde es aber besser so.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849691</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 10 Aug 2005 18:24:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Wed, 10 Aug 2005 18:39:50 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>aber:<br />
(x = y) = z;<br />
Was macht das fuern sinn ?</p>
</blockquote>
<p>Keinen wirklichen. Wer macht aber auch sowas?</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>woelltest du das compilieren koennen ?</p>
</blockquote>
<p>Durchaus. Mit primitiven Typen funktioniert das ja auch.</p>
<p>Sofern es keinen trifftigen Grund gibt, sollte op= imo foo&amp; zurückgeben, und nicht const foo&amp;. Damit ist das Handling intuitiv so wie bei primitiven Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849704</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 10 Aug 2005 18:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Thu, 11 Aug 2005 17:16:15 GMT]]></title><description><![CDATA[<p>warum wird eigentlich zweimal der Destruktor aufgerufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850340</guid><dc:creator><![CDATA[GR_Watto]]></dc:creator><pubDate>Thu, 11 Aug 2005 17:16:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 07:30:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Damit ist das Handling intuitiv so wie bei primitiven Typen.</p>
</blockquote>
<p>Vielleicht isses ja meine rebellische Natur <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="🙂"
    /> aber grad bei den zuweisungsoperatoren find ich es uberhaupt nicht intuitiv .... liegt sicher auch daran, dass die faelle , wo es ueberhaupt greifen wuerde, soweiso keiner &quot;macht&quot;</p>
<p>bei den anderen binaeren verkettenbaren operatoren hasst natuerlich vollkommen recht ...</p>
<p>Nur weil es bei den Pods geht, soll es mit meinen Klassen auch gehen, obwohls keinen Sinn macht, find ich irgendwie nicht recht nen gutes Argument</p>
<p>und wenn wer wirklich schreibt (x=y)=Z halt ich das fuer nen Denk oder tippfehler, wo der compiler ruhig maulen sollte ...</p>
<p>@GR_Watto<br />
Siehe deinen anderen Thread ... <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/850551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850551</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 12 Aug 2005 07:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 08:04:24 GMT]]></title><description><![CDATA[<p>wer (x=y)=z schreibt, ist auch bereit mal ein const_cast zu schreiben. im übrigen könnte ein x=y=z denselben effekt haben, falls x bzw. y mal ein alias für y bzw. x ist. und dann hilft dir dein const nicht weiter. ich halte diese variante aber generell für wahrscheinlicher. im übrigen ist (x=y)=z ja nur undefiniert, falls x einen trivialen zuweisungsoperator hat (andernfalls befinden sich ja im operator bereits sequence points).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850572</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Aug 2005 08:04:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 08:44:32 GMT]]></title><description><![CDATA[<blockquote>
<p>wer (x=y)=z schreibt, ist auch bereit mal ein const_cast zu schreiben</p>
</blockquote>
<p>wer sowas absichtlich macht ... ja. wie gesagt, ich wuerd immer aufn schreibfehler tippen ...<br />
Genau so wie jemand nen rueckabewert einer Zuweisung weiterverwenden sollte ... macht eigentlich kein sinn.<br />
Das const bringt an der stelle nicht viel. macht aber auch nix kaputt.<br />
Bei mir greift an der stelle eben nur die interne logic ...<br />
soll der anwender meines operators auf den rueckgabewert schreiben koennen ?<br />
noe ... in 99.99999999999999999 % der Faelle wertet er den gar nicht aus ...<br />
wenn doch, und er gleich wieder drueberschreibt, isses logisch sehr zweifelhaft<br />
also mach ma den mal const ... dann hats wenigstens die chance das beim &quot;schreibfehler&quot; der compiler mault.</p>
<p>Nenn mir nen beispiel wo genau das const einer intuitiven Verwendung entgegen wirkt, dann werd ichs mir auch wieder abgewoehnen <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>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850601</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 12 Aug 2005 08:44:32 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 09:01:48 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Genau so wie jemand nen rueckabewert einer Zuweisung weiterverwenden sollte ... macht eigentlich kein sinn.</p>
</blockquote>
<p>Also das kann ich nicht unterschreiben. Code wie dieser macht mir immer Bauchweh.</p>
<pre><code class="language-cpp">int sz_read = read(..);
while ( 0 != sz_read ) {
    ....    
    .....        // und am ende dann wieder
    sz_read = read(..);
}
</code></pre>
<p>Finde es einfach kürzer logischer besser und vor allem weniger Fehleranfällig</p>
<pre><code class="language-cpp">while ((sz_read = read(..)) != 0) {
    ....    
}
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850622</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Fri, 12 Aug 2005 09:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 09:40:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Also das kann ich nicht unterschreiben. Code wie dieser macht mir immer Bauchweh.</p>
</blockquote>
<p>Ok hasst recht, ich berichtige:</p>
<p>Macht keinen Sinn, auf den Rueckabewert einer zuweisung zu schreiben ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850664</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 12 Aug 2005 09:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 10:38:17 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>bei den anderen binaeren verkettenbaren operatoren hasst natuerlich vollkommen recht ...</p>
</blockquote>
<p>Sofern es sich um Assignment Operatoren handelt, dann 'foo&amp;', bei Non-Assignment 'const foo'.</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>Nur weil es bei den Pods geht, soll es mit meinen Klassen auch gehen</p>
</blockquote>
<p>Wer spricht denn von PODs? Obwohl es bei denen ja das Gleiche ist, wie mit primitiven Typen. Also ein weiteres Argument gegen 'const foo&amp;'.</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>obwohls keinen Sinn macht, find ich irgendwie nicht recht nen gutes Argument</p>
</blockquote>
<p>Wieso macht es keinen Sinn? Hast du noch nie Code geschrieben, in dem Folgendes gemacht wurde?</p>
<pre><code class="language-cpp">b = a = 0;
</code></pre>
<p>Nein? Dann kannst du dir vielleicht vorstellen, dass es Leute gibt, die sowas schon verwendet haben (mich eingeschlossen). Ändere nicht die Prinzipien einer Sprache, nur damit sie dir besser passt, und du damit andere mit deinem Erfahrungsschatz einschränkst.</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>und wenn wer wirklich schreibt (x=y)=Z halt ich das fuer nen Denk oder tippfehler, wo der compiler ruhig maulen sollte ...</p>
</blockquote>
<p>Nö. Der Compiler soll maulen, wenn's syntaktisch nicht korrket ist, und nicht wenn sich jemand vertippt oder 'nen Denkfehler hat. Niemand hat gesagt, dass C++ eine leichte Sprache ist. Und Fallen gibts überall. Ich denke da nur an</p>
<pre><code class="language-cpp">if (a = 0)
</code></pre>
<p>Um solchen Sachen vorzubeugen, schreiben ja einige Leute die Konstante auf die linke Seite, also</p>
<pre><code class="language-cpp">if (0 = a)
</code></pre>
<p>Aber was machst du, wenn du zwei l-values hast?<br />
C++ ist nunmal keine idiotensichere Sprache, und das wird sie auch nie werden. Also versuche erst gar nicht, eine daraus zu machen.</p>
<p>camper schrieb:</p>
<blockquote>
<p>im übrigen ist (x=y)=z ja nur undefiniert, falls x einen trivialen zuweisungsoperator hat</p>
</blockquote>
<p>Wieso das? Irgendwie steh ich im Moment auf'm Schlauch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850705</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 12 Aug 2005 10:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 13:32:16 GMT]]></title><description><![CDATA[<blockquote>
<p>Wieso macht es keinen Sinn? Hast du noch nie Code geschrieben, in dem Folgendes gemacht wurde?<br />
C/C++ Code:<br />
b = a = 0;<br />
C/C++ Code:</p>
</blockquote>
<p>Natuerlich verwende ich das auch ....<br />
und das ist selbst mit dem const correct, weil es ja als<br />
b = (a = 0) aufgeloest wird, und nicht als (b = a) = 0</p>
<p>den ruckgabewert verwendest du schon, ich natuerlich manchmal auch, aber ich schreib nie darauf rum, das mein ich damit ...</p>
<p>Ich lass mich aber immer noch belehren:<br />
nenn mir nen Fall, wo man auf die Rueckgabe einer Zuweisung rumschreibt, und es auch noch Sinn macht.</p>
<blockquote>
<p>Wer spricht denn von PODs? Obwohl es bei denen ja das Gleiche ist, wie mit primitiven Typen.</p>
</blockquote>
<p>Vielleicht lieg ich da im Begriff falsch, aber bei PODs (plain old data) gehoerten bei mir die primitiven typen immer mit rein ... oder lieg ich da falsch ?<br />
und da es fuer die nicht primitiven, aber doch PODs (struct union pointer) auch gilt, hab ichs halt auch so ausgedrueckt ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/850908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/850908</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 12 Aug 2005 13:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 15:21:28 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Natuerlich verwende ich das auch ....<br />
und das ist selbst mit dem const correct, weil es ja als<br />
b = (a = 0) aufgeloest wird, und nicht als (b = a) = 0</p>
</blockquote>
<p>Achso, da hab ich dich missverstanden. Dachte, du hättest was gegen 'x = y = z'. Dass '(x = y) = z' wenig Sinn macht, hatten wir ja schon geklärt.</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>nenn mir nen Fall, wo man auf die Rueckgabe einer Zuweisung rumschreibt, und es auch noch Sinn macht.</p>
</blockquote>
<p>Was Sinn macht oder nicht, ist natürlich relativ. Ich könnte mir aber Folgendes Szenario vorstellen:</p>
<pre><code class="language-cpp">void mach_irgendwas(foo&amp; a)
{
    //...
}

a = lese_irgendwas();
mach_irgendwas(a);
</code></pre>
<p>Ich würde immer zu dieser Schreibweise tendieren, auch weil's einfach übersichtlicher ist. Wer dennoch eine etwas kompaktere Schreibweise bevorzugt, kann dies natürlich machen. Diese Freiheit bietet C++ nunmal.</p>
<pre><code class="language-cpp">mach_irgendwas(a = lese_irgendwas());
</code></pre>
<p>Diese Möglichkeit würde mit const foo&amp; als Rückgabe vom op= nicht mehr funktionieren.</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>Vielleicht lieg ich da im Begriff falsch, aber bei PODs (plain old data) gehoerten bei mir die primitiven typen immer mit rein ... oder lieg ich da falsch ?</p>
</blockquote>
<p>Laut Wiki nicht. Ich dachte eigentlich immer, dass PODs Strukturen sind, die keine selbstdefinierten Konstruktoren und Operatoren haben. Aber offensichtlich gehören die primitiven Typen auch dazu. Man lernt halt nie aus. <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="😉"
    /> Naja, wie auch immer. Ich sprach allerdings nur von primitiven Typen. Dass Strukturen, die keinen selbstdefinierten op= haben und wiederum nur PODs als Member, sich genauso verhalten, sollte einen ja noch zusätzlich nachdenklich machen, dass man mit 'const foo&amp;' bestehende Regeln bricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851016</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 12 Aug 2005 15:21:28 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 17:43:01 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>im übrigen ist (x=y)=z ja nur undefiniert, falls x einen trivialen zuweisungsoperator hat</p>
</blockquote>
<p>Wieso das? Irgendwie steh ich im Moment auf'm Schlauch.</p>
</blockquote>
<p>das problem ist dorch, dass x zweimal zwischen zwei sequence points verändert wird, richtig?<br />
ist nun zuweisungsoperator nicht trivial, handelt es sich um ganz normale funktionsaufrufe (nur mit operator schreibweise). alle seiteneffekte durch die initialisierung eines funktionsparameters müssen abgeschlossen sein, bevor die funktion selbst aufgerufen wird.<br />
beispiel:<br />
wir haben noch op&lt;&lt;= für streams überladen, so dass es sich wie op &lt;&lt; verhält (beide geben ihren linken operanden weiter, so wie op= es tut).<br />
dann wird niemand erwarten, dass</p>
<pre><code class="language-cpp">(cout&lt;&lt;=a)&lt;&lt;=b;
</code></pre>
<p>undefiniert ist. für builtins wäre es das aber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851110</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Aug 2005 17:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 18:17:39 GMT]]></title><description><![CDATA[<p>Verstehe trotzdem noch nicht, was daran undefiniert sein soll. Der Compiler macht aus '(x = y) = z' im Grunde doch</p>
<pre><code class="language-cpp">x = y, x = z
</code></pre>
<p>Egal, ob es sich um einen trivialen oder nicht-trivialen op= handelt, ist das doch definiert. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/851144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851144</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 12 Aug 2005 18:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Fri, 12 Aug 2005 21:28:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
int main()
{
int a, b = 1, c = 2;
std::cout &lt;&lt; ( ( a = b ) = c ) &lt;&lt; std::endl;
std::cout &lt;&lt; a &lt;&lt; std::endl;
}
</code></pre>
<p>in der ersten zeile wird auf jeden fall 2 ausgegeben. was in der 2. zeile steht, ist dagegen unbestimmt. der compiler darf hier machen, was er will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851297</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Aug 2005 21:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Sat, 13 Aug 2005 09:12:45 GMT]]></title><description><![CDATA[<p>Hast du zufällig eine Stelle im Standard parat, wo das beschrieben wird?<br />
Ich dachte eigentlich, dass die Klammerung dafür sorgt, dass 'a = b' auf jeden Fall VOR 'a = c' durchgeführt wird. Sprich, dass am Ende a immer den Wert von c hat.<br />
Oder was meinst du mit &quot;der compiler darf hier machen, was er will&quot;? Was könnte denn der Compiler hier theoretisch alles machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851380</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 13 Aug 2005 09:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Sat, 13 Aug 2005 19:15:21 GMT]]></title><description><![CDATA[<p>es scheint es genügt, dass x ein objekt oder ein enum ist, damit der ausdruck unproblematisch wird. Ich würde mich auf Kapitel 5 Abs.4 stützen:</p>
<blockquote>
<p>Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and <strong>the order in which side effects take place, is unspecified.</strong> Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior vallue shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behaviour is undefined.*Example:<br />
i = v[i++]; // the behaviour is unspecified<br />
i = 7, i++, i++; // i becomes 9</p>
<p>i = ++i + 1; // the behaviour is unspecified<br />
i = i + 1; // the value of i is incrementd*</p>
</blockquote>
<p>nun ist unspecified zwar nicht dasselbe wie undefined - in der praxis kann man sich die unterscheidung aber im grunde sparen. des speichern des neuen wertes in einer variable ist nur ein seiteneffekt der zuweisung. in der regel wird man sicher entweder y oder z vorfinden. da das speichern aber nicht unbedingt atomisch erfolgt (insbesondere für grosse typen), könnte es auch etwas anderes sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851697</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 13 Aug 2005 19:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor, Zuweisungsoperator on Sat, 13 Aug 2005 22:33:37 GMT]]></title><description><![CDATA[<p>Nun, irgendwie überzeugt mich das nicht so richtig. Finde dazu im Standard aber auch nichts, was jetzt explizit dafür oder dagegen spricht. Hatte eigentlich gedacht, dass irgendwo die Auswertung von geklammerten Ausdrücken genau beschrieben wird. Vielleicht hab ich's aber auch nur übersehen. Und Seiteneffekte spielen hier ja keine Rolle. Entweder wird y zuletzt zugewiesen, oder z. Man sollte eigentlich meinen, dass dies durch die Klammerung eindeutig geregelt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851768</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 13 Aug 2005 22:33:37 GMT</pubDate></item></channel></rss>