<?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 überladen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreib mir grad einen kleinen wrapper und da bin ich auf ein problem gestoßen, denn ich will den [] operator überladen, doch irgendwie muss das programm wissen, ob der operator auf der linken oder der rechten seite steht, damit man sagen kann, was wann gemacht werden soll.</p>
<pre><code class="language-cpp">test[n] = i;
oder i = test[n];
</code></pre>
<p>ich hoffe jemand versteht mein problem</p>
<p>schöne grüße<br />
gucky</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279647/operator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 12:17:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279647.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Dec 2010 10:39:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 10:39:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreib mir grad einen kleinen wrapper und da bin ich auf ein problem gestoßen, denn ich will den [] operator überladen, doch irgendwie muss das programm wissen, ob der operator auf der linken oder der rechten seite steht, damit man sagen kann, was wann gemacht werden soll.</p>
<pre><code class="language-cpp">test[n] = i;
oder i = test[n];
</code></pre>
<p>ich hoffe jemand versteht mein problem</p>
<p>schöne grüße<br />
gucky</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000672</guid><dc:creator><![CDATA[Gucky]]></dc:creator><pubDate>Fri, 31 Dec 2010 10:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 10:48:15 GMT]]></title><description><![CDATA[<p>Warum?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

struct X
{
        int a;

        int&amp; operator[]( int p ) 
        {
                return a;
        }
};

int main()
{
        X x;

        x[0] = 42;
        int v = x[0];

        cerr &lt;&lt; v &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Das geht, mal davon abgesehen, dass es vollkommen sinnfrei ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000675</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 31 Dec 2010 10:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 12:24:13 GMT]]></title><description><![CDATA[<p>Gucky schrieb:</p>
<blockquote>
<p>doch irgendwie muss das programm wissen, ob der operator auf der linken oder der rechten seite steht</p>
</blockquote>
<p>Nein, muss es nicht. Dafür gibt es Referenzen oder Proxy-Objekte, die man zurückgeben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000714</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 31 Dec 2010 12:24:13 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 14:13:03 GMT]]></title><description><![CDATA[<p>Eigentlich recht simpel... man beachte die Kommentare!</p>
<pre><code class="language-cpp">class MyClass {
private:
  int m_val[10];

public:
  // member operator
  int&amp; operator[](const int&amp; rhs)
  {
    // prüfen, ob neben das Array gegriffen wurde
    return m_val[rhs];
  }

  // falls m_val private muss globaler Operator friend sein
  friend int&amp; operator[](MyClass&amp; lhs, const int&amp; rhs);
};

// globaler operator
int&amp; operator[](MyClass&amp; lhs, const int&amp; rhs)
{
  // prüfen, ob neben das Array gegriffen wurde
  return lhs.m_val[rhs];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2000741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000741</guid><dc:creator><![CDATA[Akiko]]></dc:creator><pubDate>Fri, 31 Dec 2010 14:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 15:20:15 GMT]]></title><description><![CDATA[<p>Akiko schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int&amp; operator[](const int&amp; rhs)
</code></pre>
</blockquote>
<p>Warum <code>const int&amp;</code> und nicht <code>int</code> als Parameter? Oder noch besser <code>unsigned int</code> und mit einem bezeichnenderen Namen als &quot;rhs&quot; (z.B. &quot;index&quot;).</p>
<p>Akiko schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// globaler operator
int&amp; operator[](MyClass&amp; lhs, const int&amp; rhs)
</code></pre>
</blockquote>
<p><code>operator[]</code> kann nicht global sein.</p>
<p>Zudem sollte man unter Umständen eine Const-Überladung bereitstellen:</p>
<pre><code class="language-cpp">int MyClass::operator[](unsigned int index) const;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2000762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000762</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 31 Dec 2010 15:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 15:53:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Akiko schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int&amp; operator[](const int&amp; rhs)
</code></pre>
</blockquote>
<p>Warum <code>const int&amp;</code> und nicht <code>int</code> als Parameter? Oder noch besser <code>unsigned int</code> und mit einem bezeichnenderen Namen als &quot;rhs&quot; (z.B. &quot;index&quot;).</p>
<p>Akiko schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// globaler operator
int&amp; operator[](MyClass&amp; lhs, const int&amp; rhs)
</code></pre>
</blockquote>
<p><code>operator[]</code> kann nicht global sein.</p>
<p>Zudem sollte man unter Umständen eine Const-Überladung bereitstellen:</p>
<pre><code class="language-cpp">int MyClass::operator[](unsigned int index) const;
</code></pre>
</blockquote>
<p>Ist Gewohnheit, da ich auf System mit 8, 16, 32 und 64 Bit unterwegs bin und in der Regel ein int 32 Bit groß ist. Per Value wären das immer 32 Bit, die transferiert werden, da aber eine Refrenzen intern ein Zeiger ist, wäre der Zeiger auf einem 8 oder 16 Bit System etwas kleiner, oder platzsparender. <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="😉"
    /> Korrekterweise wäre wohl (solange es keine 128 Bit Systeme gibt) ein uint64_t gewesen.</p>
<p>Weil lhs und rhs das Ganze genau beschreibt, lhs = left hand side (lvalue) und rhs = right hand side (rvalue). Gerade bei Kontruktoren und Operatoren finde ich das unheimlich anschaulich.</p>
<p>Ja, den braucht man allerdings nur selten. Ich lege den const operator immer nur dann an, wenn der Compiler meckert. <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="😉"
    /> Solange dead-code-Optimierungen nicht richtig funktionieren, ist das glaub ich der bessere Weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000789</guid><dc:creator><![CDATA[Akiko]]></dc:creator><pubDate>Fri, 31 Dec 2010 15:53:40 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 17:11:21 GMT]]></title><description><![CDATA[<p>Akiko schrieb:</p>
<blockquote>
<p>Ist Gewohnheit, da ich auf System mit 8, 16, 32 und 64 Bit unterwegs bin und in der Regel ein int 32 Bit groß ist. Per Value wären das immer 32 Bit, die transferiert werden, da aber eine Refrenzen intern ein Zeiger ist, wäre der Zeiger auf einem 8 oder 16 Bit System etwas kleiner, oder platzsparender. <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="😉"
    /></p>
</blockquote>
<p>Und dann hoffst du, dass eine Indirektion über einen Zeiger schneller ist, was?</p>
<blockquote>
<p>Korrekterweise wäre wohl (solange es keine 128 Bit Systeme gibt) ein uint64_t gewesen.</p>
</blockquote>
<p>korrekt ist immer size_t. Dafür ist der da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000816</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 31 Dec 2010 17:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 18:10:04 GMT]]></title><description><![CDATA[<p>Akiko schrieb:</p>
<blockquote>
<p>Weil lhs und rhs das Ganze genau beschreibt, lhs = left hand side (lvalue) und rhs = right hand side (rvalue). Gerade bei Kontruktoren und Operatoren finde ich das unheimlich anschaulich.</p>
</blockquote>
<p>Oh boy...</p>
<p>Den Index bei operator [] als &quot;rechte Seite&quot; zu bezeichnen halte ich für ziemlich daneben.<br />
Mal ganz davon abgesehen dass <code>lvalue</code> und <code>rvalue</code> nichts mit links oder rechts zu tun haben.</p>
<blockquote>
<p>Ja, den braucht man allerdings nur selten. Ich lege den const operator immer nur dann an, wenn der Compiler meckert. <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="😉"
    /> Solange dead-code-Optimierungen nicht richtig funktionieren, ist das glaub ich der bessere Weg.</p>
</blockquote>
<p>Lebst du in den 80ern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000831</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 31 Dec 2010 18:10:04 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 18:58:28 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Den Index bei operator [] als &quot;rechte Seite&quot; zu bezeichnen halte ich für ziemlich daneben.<br />
Mal ganz davon abgesehen dass <code>lvalue</code> und <code>rvalue</code> nichts mit links oder rechts zu tun haben.</p>
</blockquote>
<p>Hehe, ja, heute ist das etwas irritierend, liegt aber daran, dass sich über die Zeit die Bedeutung etwas geändert hat. Es ist aber nach wie vor eine Eselsbrücke.</p>
<p>Wikipedia schrieb:</p>
<blockquote>
<p>In C, the term lvalue originally meant something that could be assigned to (coming from left-value, indicating it was on the left side of the assignment operator), but since 'const' was added to the language, this now is termed a 'modifiable lvalue'.</p>
</blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Lebst du in den 80ern?</p>
</blockquote>
<p>Es gibt noch mehr als x86... zum Beispiel Embedded Rechner. Oder wenn du es ganz schräg magst, s390 und s390x mit 31 oder 62 Bit. Microkontroller sind in der Regel 8 oder 16 Bit CPUs, haben aber 32 oder 64 Bit ALUs. Ein Paradebeispiel wäre der 68000 als 32 Bit CPU, aber Zugriffe erfolgen in 16 Bit.</p>
<p>otze schrieb:</p>
<blockquote>
<p>Und dann hoffst du, dass eine Indirektion über einen Zeiger schneller ist, was?</p>
</blockquote>
<p>Das Compilat mal als Assembler ausgeben und dann siehst du, dass eine Referenz und ein Zeiger im Maschinencode identisch sind.</p>
<p>otze schrieb:</p>
<blockquote>
<p>korrekt ist immer size_t. Dafür ist der da.</p>
</blockquote>
<p>Stimmt für Zeigergrößen, aber nicht für die größtmögliche Zahl. Es gebe ja noch uint128_t (verständlich, irgendwie muss man ja auch ein SSE Register voll bekommen). Und im nächsten Jahr wird es dank AVX auch uint256_t geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000844</guid><dc:creator><![CDATA[Akiko]]></dc:creator><pubDate>Fri, 31 Dec 2010 18:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Fri, 31 Dec 2010 20:02:20 GMT]]></title><description><![CDATA[<p>OK, jetzt wird's mir hier zu albern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000857</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 31 Dec 2010 20:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to [] operator überladen on Sat, 01 Jan 2011 07:49:50 GMT]]></title><description><![CDATA[<p>Akiko schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<p>Und dann hoffst du, dass eine Indirektion über einen Zeiger schneller ist, was?</p>
</blockquote>
<p>Das Compilat mal als Assembler ausgeben und dann siehst du, dass eine Referenz und ein Zeiger im Maschinencode identisch sind.</p>
</blockquote>
<p>Ja, ich weiß. Und dann hoffst du, dass deine Indirektion über einen Zeiger schneller ist. Mensch, wenn du eine Referenz übergibst und danach darauf zugreifst, dann findet <strong>eine Kopie</strong> statt. Deine Version ist also fast immer langsammer, wiel zu deiner Kopie noch eine Indirektion kommt.</p>
<blockquote>
<p>Stimmt für Zeigergrößen, aber nicht für die größtmögliche Zahl.</p>
</blockquote>
<p>beim operator[] geht es um Speicherzugriffe. Und Offensichtlich braucht man keine größeren Zahlenwerte als im SPeicher referenziert werden können, weil man damit eh ins Nirvana schreibt. Und size_t ist der Typ der exakt groß genug ist um die maximal allokierbare Speichergröße aufzunehmen. Hätte man also in deinem Code irgendeinen Vorteil irgendwas größeres zu nehmen? Nein, weil dein Array nicht größer sein kann. Verständlich genug? Super! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000897</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 01 Jan 2011 07:49:50 GMT</pubDate></item></channel></rss>