<?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[Funktionsdeklaration mit &amp;amp;]]></title><description><![CDATA[<p>Ich hab hier ein Stück Code, dass ich gefunden hab in den Geometrieheadern von einer Graphik Engine. Ich suche jetzt schon seit 2 Stunden nach einer Lösung.</p>
<pre><code>float &amp;operator[](int i)       { return v[i]; }
    float  operator[](int i) const { return v[i]; }
</code></pre>
<p>Er deklariert hier zwei mal eine Funktion die den [] Operanden overloaded. Eine deklariert er mit float operator[] und eine mit float &amp;operator[]. Was ist der Unterschied?</p>
<p>Bei der ohne &amp; schreibt er cost nach den Parametern. Aber noch vor dem Funktionsblock. Was hat das zu bedeuten?</p>
<p>Tut mir Leid, dass ich so eine einfache Frage stelle, aber ich finde wirklich nirgendwo eine Lösung und ich wäre euch sehr verbunden wenn ihr mal ein Auge zudrücken könntet und die zwei Fragen beantworten könntet.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273119/funktionsdeklaration-mit-amp</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 08:36:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273119.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 Aug 2010 13:07:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 13:07:05 GMT]]></title><description><![CDATA[<p>Ich hab hier ein Stück Code, dass ich gefunden hab in den Geometrieheadern von einer Graphik Engine. Ich suche jetzt schon seit 2 Stunden nach einer Lösung.</p>
<pre><code>float &amp;operator[](int i)       { return v[i]; }
    float  operator[](int i) const { return v[i]; }
</code></pre>
<p>Er deklariert hier zwei mal eine Funktion die den [] Operanden overloaded. Eine deklariert er mit float operator[] und eine mit float &amp;operator[]. Was ist der Unterschied?</p>
<p>Bei der ohne &amp; schreibt er cost nach den Parametern. Aber noch vor dem Funktionsblock. Was hat das zu bedeuten?</p>
<p>Tut mir Leid, dass ich so eine einfache Frage stelle, aber ich finde wirklich nirgendwo eine Lösung und ich wäre euch sehr verbunden wenn ihr mal ein Auge zudrücken könntet und die zwei Fragen beantworten könntet.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946556</guid><dc:creator><![CDATA[Steinbeisser]]></dc:creator><pubDate>Tue, 31 Aug 2010 13:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 13:17:12 GMT]]></title><description><![CDATA[<p>Steinbeisser schrieb:</p>
<blockquote>
<p>Er deklariert hier zwei mal eine Funktion die den [] Operanden overloaded. Eine deklariert er mit float operator[] und eine mit float &amp;operator[]. Was ist der Unterschied?</p>
</blockquote>
<p>Die erste Methode gibt eine Referenz auf das <code>float</code> Objekt zurück. Die zweite Methode gibt eine Kopie zurück.</p>
<p>Steinbeisser schrieb:</p>
<blockquote>
<p>Bei der ohne &amp; schreibt er cost nach den Parametern. Aber noch vor dem Funktionsblock. Was hat das zu bedeuten?</p>
</blockquote>
<p>Dass die Methode konstant ist, somit keine Membervariablen verändert.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946563</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 31 Aug 2010 13:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 13:19:10 GMT]]></title><description><![CDATA[<p>const bedeutet dass es eine konstante Methode ist, die auf konstante Instanzen aufgerufen wird. Daher kann sie keine Referenz zurückgeben, sondern eine Kopie.</p>
<pre><code class="language-cpp">void foo(const deintyp&amp; x)
{
  x[1]; // const version
}
void bar(deintyp&amp; x)
{
  x[1]; // version ohne const
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1946564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946564</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 31 Aug 2010 13:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 13:20:15 GMT]]></title><description><![CDATA[<p>Das mit dem &amp;-Zeichen ist eine Referenz. das ist ein wichtiges und mächtiges Sprachkonstrukt, welches du unbedingt mal in einem Lehrbuch nachschlagen solltest. Kurze Erklärung was es hier macht: Im Fall ohne &amp; wird eine Kopie des Wertes v[i] zurückgegeben. Im Falle mit dem &amp;-Zeichen wird quasi v[i] selbst zurückgegeben. Das heißt man kann v[i] über den Funktionsaufruf ändern.</p>
<p>Die Sache mit dem const: Auch ein wichtiges Sprachkonstrukt. Die const-heit einer Funktion geht mit in die Überladungsauflösung ein. Das heißt man kann zwei gleichnamige Memberfunktionen haben die sich nur in ihrer constness unterscheiden. In einem Kontext wo man ein konstantes Objekt vorliegen hat wird dann die const-Variante genommen.</p>
<p>Hier sieht man auch den Unterschied mit der Referenz und der Kopie: Im falle mit dem const dürfte man natürlich nicht zulassen, dass der Wert v[i] über die Referenz geändert wird, denn das würde die constness verletzen. Daher wird eine Kopie zurückgegeben (eine Alternative wäre eine const Referenz). Im Falle der Rückgabe der Referenz kann die Funktion natürlich nicht const sein, da man über die Referenz v[i] ändern könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946565</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 31 Aug 2010 13:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 13:29:40 GMT]]></title><description><![CDATA[<p>Meine Güte, was macht ihr denn hier für komplexe Konstrukte aus einer const-Methode?</p>
<p>const hinter einer Methodendeklaration bedeutet schlicht, dass der this-Zeiger als Zeiger-auf-const (X const <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="😉"
    /> übergeben wird. Ansonsten verhält sich so was wie jede andere überladene Funktion auch.</p>
<p>Das geht übrigens auch mit volatile, obwohl ich dafür bisher keine Verwendung gefunden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946570</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 31 Aug 2010 13:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 14:22:27 GMT]]></title><description><![CDATA[<p>Das const ist hier wohl ein Kunstgriff (rate ich mal), damit sich die Signatur der beiden Funktionen unterscheidet.</p>
<p>Der Rückgabewert unterscheidet sich zwar zwischen den beiden Funktionen, aber der zählt nicht zur Signatur.<br />
Ohne das const gäbe es einen Fehler beim Kompilieren ('function redefinition' oder sowas).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946586</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Tue, 31 Aug 2010 14:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 14:21:26 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void foo(const deintyp&amp; x)
{
  x[1]; // const version
}
void bar(deintyp&amp; x)
{
  x[1]; // version ohne const
}
</code></pre>
</blockquote>
<p>Schönes Beispiel. Ein <code>x[1]=99;</code> würde auch nur im zweiten Fall funktionieren, da im ersten Fall keine Referenz sondern nur ein Wert zurückkommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946587</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 31 Aug 2010 14:21:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 14:28:58 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>const bedeutet dass es eine konstante Methode ist, die auf konstante Instanzen aufgerufen wird.</p>
</blockquote>
<p>Genau genommen muss sie nicht unbedingt auf konstanten Instanzen aufgerufen werden. Wenn keine nicht-konstante Version vorhanden ist, wird die <code>const</code> -qualifizierte Methode immer aufgerufen.</p>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Daher kann sie keine Referenz zurückgeben, sondern eine Kopie.</p>
</blockquote>
<p>Referenz geht schon. Wenn sie allerdings auf Membervariablen verweist, muss es sich um eine Const-Referenz ( <code>const float&amp;</code> ) handeln, was bei <code>float</code> weniger sinnvoll als eine Kopie ist.</p>
<p>antialias schrieb:</p>
<blockquote>
<p>Das const ist hier wohl ein Kunstgriff (rate ich mal), damit sich die Signatur der beiden Funktionen unterscheidet.</p>
</blockquote>
<p>Ja, allerdings ist das nicht nur Mittel zum Zweck oder Workaround, sondern gerade der Zweck selbst: Man will unterschiedliches Verhalten für konstante und veränderbare Objekte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946595</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 31 Aug 2010 14:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 15:08:24 GMT]]></title><description><![CDATA[<p>Stimmt...eben noch ein wenig gegoogelt und ne schöne Erklärung hier gefunden:<br />
<a href="http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12" rel="nofollow">http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946620</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Tue, 31 Aug 2010 15:08:24 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Tue, 31 Aug 2010 21:31:16 GMT]]></title><description><![CDATA[<p>Erstmal ein großes großes Dankeschön an alle Leute die geantwortet haben. Ich bin begeistert wie schnell die Antworten gekommen sind und wie hilfsbereit ihr seit. Ich werd dann mal weiter Fachbücher lesen. Ich werde mich hier auf jeden Fall registrieren und in Zukunft vielleicht ganz interessante Projekte herzeigen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946782</guid><dc:creator><![CDATA[Steinbeisser]]></dc:creator><pubDate>Tue, 31 Aug 2010 21:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Fri, 03 Sep 2010 07:14:12 GMT]]></title><description><![CDATA[<p>@seldon<br />
volatile in der Methodendeklaration <code>int getVal(void) volatile;</code> bewirkt, dass der this-Zeiger volatile behandelt wird und damit der Compiler eine Spezielle Zugriffssemantik beachtet. (s. Standard Kap 9.3.2)</p>
<p>Das kann, vermute ich, beim Multithreading hilfreich sein, wenn man Locks o.ä. mit eine Klasse realisieren will. Ein konkretes Beispiel kann ich Dir im Moment aber auch nicht liefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947669</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 03 Sep 2010 07:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsdeklaration mit &amp;amp; on Fri, 03 Sep 2010 10:20:05 GMT]]></title><description><![CDATA[<p>ogni42 schrieb:</p>
<blockquote>
<p>@seldon<br />
volatile in der Methodendeklaration <code>int getVal(void) volatile;</code> bewirkt, dass der this-Zeiger volatile behandelt wird und damit der Compiler eine Spezielle Zugriffssemantik beachtet. (s. Standard Kap 9.3.2)</p>
<p>Das kann, vermute ich, beim Multithreading hilfreich sein, wenn man Locks o.ä. mit eine Klasse realisieren will. Ein konkretes Beispiel kann ich Dir im Moment aber auch nicht liefern.</p>
</blockquote>
<p>Andrei Alexandrescu hat <a href="http://www.drdobbs.com/184403766;jsessionid=C0Y33IA1KLGCTQE1GHRSKHWATMY32JVN" rel="nofollow">hier</a> mal ein Beispiel gebracht. Allerdings ist das nicht wirklich so nützlich, wie es aussehen mag. Zudem bewegt man sich dabei doch eher in einer Grauzone des Standards, denn die Semantik von volatile mit Objekten, die keine primtiven Typen oder Aggregate davon sind, ist nicht wirklich gut spezifiziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947752</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 03 Sep 2010 10:20:05 GMT</pubDate></item></channel></rss>