<?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[Operator [] für konstante Objekte]]></title><description><![CDATA[<p>So hiho mal ne Frage:</p>
<p>bisher habe ich, wenn ich den [] überladen habe für die konstante Variante sowas in der Art geschrieben:</p>
<pre><code class="language-cpp">char operator[](int) const;
</code></pre>
<p>Das ist aus einer Test-Stringklasse(Übung zum Stroustrup-Buch^^)<br />
Für nichtkonstante Objekte muss man natürlich eine Proxyklasse benutzen.</p>
<p>So jetzt zur Frage: ich sitz grad vorm &quot;Mehr Effektiv C++&quot; und der gibt auch bei der konstanten Variante die Proxyklasse zurück(in const-Form)</p>
<p>ausm Buch:</p>
<pre><code class="language-cpp">const String::CharProxy String::operator[](int index) const
{
   ...
}
</code></pre>
<p>Was ist nun besser???<br />
Ich würde ja zur ersten Variante neigen, weil dort kein Objekt erzeugt wird. Gibt es einen Nachteil der ersten Variante oder warum tut Meyers das was er da tut? ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/138354/operator-für-konstante-objekte</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 04:06:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/138354.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Feb 2006 16:38:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Sat, 25 Feb 2006 16:38:12 GMT]]></title><description><![CDATA[<p>So hiho mal ne Frage:</p>
<p>bisher habe ich, wenn ich den [] überladen habe für die konstante Variante sowas in der Art geschrieben:</p>
<pre><code class="language-cpp">char operator[](int) const;
</code></pre>
<p>Das ist aus einer Test-Stringklasse(Übung zum Stroustrup-Buch^^)<br />
Für nichtkonstante Objekte muss man natürlich eine Proxyklasse benutzen.</p>
<p>So jetzt zur Frage: ich sitz grad vorm &quot;Mehr Effektiv C++&quot; und der gibt auch bei der konstanten Variante die Proxyklasse zurück(in const-Form)</p>
<p>ausm Buch:</p>
<pre><code class="language-cpp">const String::CharProxy String::operator[](int index) const
{
   ...
}
</code></pre>
<p>Was ist nun besser???<br />
Ich würde ja zur ersten Variante neigen, weil dort kein Objekt erzeugt wird. Gibt es einen Nachteil der ersten Variante oder warum tut Meyers das was er da tut? ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1002713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1002713</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Sat, 25 Feb 2006 16:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Sat, 25 Feb 2006 17:51:21 GMT]]></title><description><![CDATA[<p>Lies dir das Kapitel von Meyers nochmal durch, er erklärt da wieso er da nen Proxy verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1002801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1002801</guid><dc:creator><![CDATA[Lesen]]></dc:creator><pubDate>Sat, 25 Feb 2006 17:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Sun, 26 Feb 2006 20:12:31 GMT]]></title><description><![CDATA[<p>Ich weis nicht was du meinst. Mir geht es nicht um den Proxy an sichm warum der den generekk verwendet das weis, wusst auch bevor ich das gelesen habe. MIr gehts <strong>nur</strong> um die const-Variante. UNd wie gesagt, ich dachte im Stroustroup wird da auch an dieser Stelle <strong>keine</strong> Porxyklasse genommen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1003664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1003664</guid><dc:creator><![CDATA[Pellaeon_home]]></dc:creator><pubDate>Sun, 26 Feb 2006 20:12:31 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 08:06:15 GMT]]></title><description><![CDATA[<p>Ich habe More Effective C++ gerade nicht zur Hand, von daher kann ich nichts über Meyers Absichten an der Stelle sagen. Das einzige Problem, dass ich aber an dieser Stelle sehe, ist dass man ohne Proxy ein änderbares Handle auf interne Daten rausgibt (die kanonische Form des []-Operators gibt übrigens immer eine (Const-)Referenz zurück).</p>
<p>Der Grund im const-Fall nun auch den Proxy zurückzugeben erscheint mir nicht ganz sinnig. Würde nur Sinn machen, wenn der Rückgabe-Wert mehrfach gelesen wird und sich zwischen den Aufrufen durch Nebeneffekte ändern kann (Beispiel: Strings mit Referenz-Zählung - der Proxy hätte dann eine poztenziell längere Lebensdauer als eine Referenz, die stillschweigend ungültig würde). Ich denke, mein Vorredner will dich auf irgendwas stoßen, was Meyers Absichten an der Stelle sind. Wie gesagt, ich habe das Buch leider nicht zur Hand und kann dir also nicht mehr als diesen Hinweis geben.</p>
<p>Edit: deutsche Sprache, schwere Sprache <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Edit2: Auch in der STL wird keine Proxy-Klasse genommen - aus guten Gründen. Ein std::string soll sich anfühlen wie ein char-Array. D.h. insbesondere, dass der []-Operator eine char-Referenz zurückgibt (denn er speichert chars) und kein mysteriöses Proxy-Objekt. Allerdings hat man sich ziemlich verkrampft im Standard, um die Lebensdauer dieser Referenz festzulegen. Hängt alles damit zusammen, dass man eine Definition für strings haben wollte, die auch eine referenzgezählte Implementation zulässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1003877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1003877</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 27 Feb 2006 08:06:15 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 09:06:41 GMT]]></title><description><![CDATA[<p>Also der const in &quot;meiner Fassung&quot; oben gibt ja keine Referenz zurück, sondern den char by value, also eine Gefahr des Überschreibens besteht nicht. Und sowas</p>
<pre><code class="language-cpp">const String test = &quot;foo&quot;;
test[0] = 'm';
</code></pre>
<p>bringt bei beiden Varianten einen Compile-Fehler, wies ja auch sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1003917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1003917</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 27 Feb 2006 09:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 10:01:01 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>...bringt bei beiden Varianten einen Compile-Fehler, wies ja auch sein soll.</p>
</blockquote>
<p>Wenn das in der nicht-konstanten Variante einen Compile-Fehler bringt, würde ich dir das aber als Programmier-Fehler oder zumindest als äußert unübliches Verhalten &quot;vorwerfen&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1003937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1003937</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 27 Feb 2006 10:01:01 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 11:57:15 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Pellaeon schrieb:</p>
<blockquote>
<p>...bringt bei beiden Varianten einen Compile-Fehler, wies ja auch sein soll.</p>
</blockquote>
<p>Wenn das in der nicht-konstanten Variante einen Compile-Fehler bringt, würde ich dir das aber als Programmier-Fehler oder zumindest als äußert unübliches Verhalten &quot;vorwerfen&quot;.</p>
</blockquote>
<p>mit beiden Varianten habe ich mich auf die <strong>beiden const-Varianten</strong> bezogen <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/1004013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1004013</guid><dc:creator><![CDATA[Pellaeon_home]]></dc:creator><pubDate>Mon, 27 Feb 2006 11:57:15 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 12:41:55 GMT]]></title><description><![CDATA[<p>Also gut ich zitiere mal für dich</p>
<p>[quote=&quot;Mehr Effektiv C++]<br />
&quot;Aber halt&quot;, sagen Sie, das brauchen wir doch nicht. Wir können operator[] doch anhand des Schlüsselwortes const überladen, und das gibt uns die Möglichkeit, Lesen und Schreiben zu unterscheiden.&quot; Mit anderen Worten schlagen Sie folgende Lösung vor:</p>
<pre><code class="language-cpp">class String{
public:
  char  operator[] (int index) const; //für Lesen
  char&amp; operator[] (int index);       //für Schreiben
  ...
};
</code></pre>
<p>Leider funktioniert das nicht. Compiler wählen zwischen der konstanten und der nichtkonstanten Memberfunktion nur aus, indem sie nachsehen, ob das Objekt, das die Funktion aufruft, const ist oder nicht. Der Kontext, innerhalb dessen der Aufruf erfolgt, wird nicht beachtet*(Anmerkung von mir: Es ging hier um die Unterscheidung zwischen rvalue und lvalue, dies kann man nicht innerhalb von op[] unterscheiden)*.<br />
[/quote]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1004069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1004069</guid><dc:creator><![CDATA[Lesen]]></dc:creator><pubDate>Mon, 27 Feb 2006 12:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 12:42:52 GMT]]></title><description><![CDATA[<p>--Oh nen kleinen Tippfehler gehabt, hier in der korrigierten Version:</p>
<p>Also gut ich zitiere mal für dich</p>
<p>Mehr Effektiv C++ schrieb:</p>
<blockquote>
<p>&quot;Aber halt&quot;, sagen Sie, das brauchen wir doch nicht. Wir können operator[] doch anhand des Schlüsselwortes const überladen, und das gibt uns die Möglichkeit, Lesen und Schreiben zu unterscheiden.&quot; Mit anderen Worten schlagen Sie folgende Lösung vor:</p>
<pre><code class="language-cpp">class String{
public:
  char  operator[] (int index) const; //für Lesen
  char&amp; operator[] (int index);       //für Schreiben
  ...
};
</code></pre>
<p>Leider funktioniert das nicht. Compiler wählen zwischen der konstanten und der nichtkonstanten Memberfunktion nur aus, indem sie nachsehen, ob das Objekt, das die Funktion aufruft, const ist oder nicht. Der Kontext, innerhalb dessen der Aufruf erfolgt, wird nicht beachtet*(Anmerkung von mir: Es ging hier um die Unterscheidung zwischen rvalue und lvalue, dies kann man nicht innerhalb von op[] unterscheiden)*.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1004070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1004070</guid><dc:creator><![CDATA[Lesen]]></dc:creator><pubDate>Mon, 27 Feb 2006 12:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 13:55:06 GMT]]></title><description><![CDATA[<p>Neeeeeeeeeeeeeeeeeeeein @ lesen, nimms nicht persönlich, aber du solltest lesen lernen^^ <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Es geht mir <strong>nicht</strong> um die Proxyklasse allgemein. Warum man die braucht weis ich, wusst ich auch schon bevor ich das im Meyers' gelesen habe<br />
Es geht um diesen konkreten Fall</p>
<pre><code class="language-cpp">const String test = &quot;foo&quot;;
test[0] = 'm'; //ergibt Fehler
</code></pre>
<p>Bei einem nichtkonstanten Objekt, klar da ist der Sinn der Proxyklasse ja logisch, das ist das worauf dein Zitat abzielt.<br />
Aber bei einem konstanten Objket, welches die const-Variante aufruft, ist es halt nicht nötig.<br />
Siehe @7H3 N4C3R Posts im Bezug zur STL<br />
Darum geht es mir</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1004167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1004167</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 27 Feb 2006 13:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 14:21:15 GMT]]></title><description><![CDATA[<p>Achso jetzt verstehe ich was du meinst.</p>
<p>Nun ich denke da kann ich dir helfen, bei meinem Buch steht da noch folgendes:</p>
<p>Mehr Effektiv C++ schrieb:</p>
<blockquote>
<p>In den Errata weist Meyers darauf hin, dass die konstante Version von operator[] hier einfach const char&amp; liefern kann. Das ist effektiver. Dann müssen auch einige folgende Methoden leicht modifiziert werden. (A.d.Ü.)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1004202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1004202</guid><dc:creator><![CDATA[Lesen]]></dc:creator><pubDate>Mon, 27 Feb 2006 14:21:15 GMT</pubDate></item><item><title><![CDATA[Reply to Operator [] für konstante Objekte on Mon, 27 Feb 2006 14:31:11 GMT]]></title><description><![CDATA[<p>Lesen schrieb:</p>
<blockquote>
<p>Achso jetzt verstehe ich was du meinst.</p>
<p>Nun ich denke da kann ich dir helfen, bei meinem Buch steht da noch folgendes:</p>
<p>Mehr Effektiv C++ schrieb:</p>
<blockquote>
<p>In den Errata weist Meyers darauf hin, dass die konstante Version von operator[] hier einfach const char&amp; liefern kann. Das ist effektiver. Dann müssen auch einige folgende Methoden leicht modifiziert werden. (A.d.Ü.)</p>
</blockquote>
</blockquote>
<p>T H X <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Hab hier ne ältere Buch-Version(aus der Bibliothek), da stand das nicht dazu.<br />
Das wollt ich wissen <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/1004210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1004210</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 27 Feb 2006 14:31:11 GMT</pubDate></item></channel></rss>