<?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[Nochmal: const und Referenzen]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe nochmal eine Frage bezüglich dem Bezeichner const und Referenzen. Ich dachte eigentlich, dass ich durch eine meiner letzten Fragen es verstanden hätte, doch nun verwirrt mich mein Code wieder.</p>
<p>Ich habe eine Klasse (MobilePhone), die eine Getter Methode besitzt. Diese sieht so aus:</p>
<pre><code class="language-cpp">const string&amp; getOwner()  const {return owner;};
</code></pre>
<p>Diese Methode greift nur lesend auf die Klasse zu (zweites const) und gibt eine konstante Referenz auf &quot;owner&quot; zurück. owner ist ein private Attribut der Klasse.</p>
<p>Nun dachte ich, dass diese konstante Referenz nicht geändert werden kann. Deswegen führt folgender Code zu einem Fehler:</p>
<pre><code class="language-cpp">string&amp; str = handy.getOwner(); //handy ist eine Instanz meiner Klasse
</code></pre>
<p>1.) Liege ich bei folgender Aussage richtig: &quot;str&quot; ist ein Aliasname auf das Attribut, das durch &quot;getOwner&quot; zurückgegeben wird. Da die Rückgabe konstant ist, muss auch der Aliasname (Referenz) konstant sein.</p>
<p>Folgendes funktioniert aber:</p>
<pre><code class="language-cpp">string str = handy.getOwner(); //handy ist eine Instanz meiner Klasse
</code></pre>
<p>2.) Ich erkläre es mir dadurch, dass zwar eine konstante Referenz zurückgegeben wird, doch der Inhalt dieser Referenz wieder in einer eigenständigen Variablen gespeichert wird, die dann nicht konstant sein muss.</p>
<p>Ist meine Vermutung richtig, warum &quot;str&quot; nicht konstant sein muss oder habe ich das Konzept von &quot;const&quot; immer noch nicht verstanden?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270836/nochmal-const-und-referenzen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 22:11:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270836.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Jul 2010 08:51:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 08:51:43 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe nochmal eine Frage bezüglich dem Bezeichner const und Referenzen. Ich dachte eigentlich, dass ich durch eine meiner letzten Fragen es verstanden hätte, doch nun verwirrt mich mein Code wieder.</p>
<p>Ich habe eine Klasse (MobilePhone), die eine Getter Methode besitzt. Diese sieht so aus:</p>
<pre><code class="language-cpp">const string&amp; getOwner()  const {return owner;};
</code></pre>
<p>Diese Methode greift nur lesend auf die Klasse zu (zweites const) und gibt eine konstante Referenz auf &quot;owner&quot; zurück. owner ist ein private Attribut der Klasse.</p>
<p>Nun dachte ich, dass diese konstante Referenz nicht geändert werden kann. Deswegen führt folgender Code zu einem Fehler:</p>
<pre><code class="language-cpp">string&amp; str = handy.getOwner(); //handy ist eine Instanz meiner Klasse
</code></pre>
<p>1.) Liege ich bei folgender Aussage richtig: &quot;str&quot; ist ein Aliasname auf das Attribut, das durch &quot;getOwner&quot; zurückgegeben wird. Da die Rückgabe konstant ist, muss auch der Aliasname (Referenz) konstant sein.</p>
<p>Folgendes funktioniert aber:</p>
<pre><code class="language-cpp">string str = handy.getOwner(); //handy ist eine Instanz meiner Klasse
</code></pre>
<p>2.) Ich erkläre es mir dadurch, dass zwar eine konstante Referenz zurückgegeben wird, doch der Inhalt dieser Referenz wieder in einer eigenständigen Variablen gespeichert wird, die dann nicht konstant sein muss.</p>
<p>Ist meine Vermutung richtig, warum &quot;str&quot; nicht konstant sein muss oder habe ich das Konzept von &quot;const&quot; immer noch nicht verstanden?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928434</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 08:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 08:54:53 GMT]]></title><description><![CDATA[<p>Beides richtig. Das Typsystem erzwingt über const lediglich, dass du keinen Schreibzugriff auf das Original bekommst, aber wenn du dir eine Kopie ziehst, kannst du damit natürlich machen, was du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928438</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 19 Jul 2010 08:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 09:02:20 GMT]]></title><description><![CDATA[<p>Alles klar, dann ist mein Weltbild doch gerettet <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>
<p>Ich merke mir also: Es geht const also immer um das Element, das als const deklariert worden ist (ist eigentlich auch logisch xD).</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928443</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 09:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 09:25:37 GMT]]></title><description><![CDATA[<p>Warum wird bei solch einer Funktion &quot;int&quot; angenommen und kann daher nicht kompuiliert werden?</p>
<pre><code class="language-cpp">const&amp; unsigned char getR() const {return red;}; //red ist vom Typ unsigned char
</code></pre>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928452</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 09:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 09:31:50 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Warum wird bei solch einer Funktion &quot;int&quot; angenommen und kann daher nicht kompuiliert werden?</p>
<pre><code class="language-cpp">const&amp; unsigned char getR() const {return red;}; //red ist vom Typ unsigned char
</code></pre>
<p>Vielen Dank<br />
lg, freakC++</p>
</blockquote>
<p>Versuch es mal so <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>
<pre><code class="language-cpp">const unsigned char&amp; getR() const {return red;}; //red ist vom Typ unsigned char
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928453</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 09:31:50 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 09:34:26 GMT]]></title><description><![CDATA[<p>ups...peinlich *rotwerd*</p>
<p>Danke für den Tipp!</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928457</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 09:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 10:02:02 GMT]]></title><description><![CDATA[<p>Da du dich gerade mit <em>const</em> zu befassen scheinst, dachte ich, ich schreib dir da gerade noch etwas dazu.</p>
<p>Wenn du es schon weißt, ist das ja gut ;-),<br />
ansonsten schau dir das mal an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<pre><code class="language-cpp">int fkt();

int main()
{
    fkt() = 1; // error: no-lvalue in assignment

    return 0;
}

/*
    Es wird zwar ganz normal eine Kopie gemacht und diese zurückgegeben,
    die aber per Definition ein r-value ist.

    Deswegen kannst du dir das &quot;const&quot; bei retrun-by-value immer sparen,
    da man ja einem r-value sowieso nichts zuweisen kann.

    --&gt; Dies gilt aber nur für vordefinierte Datentypen, nicht für abstrakte Datentypen.
*/
int fkt()
{
    return 7;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928468</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:02:02 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 10:18:59 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung. Zwar hätte ich das nie geschrieben, aber deine Erklärung hat mir beim Verständnis nochmal weitergebracht.</p>
<p>Hier braucht man aber nicht const, doch eine Ausgabe funktioniert trotzdem nicht. Hat das etwas damit zu tun? Ich kann zwar message() wie bei dir etwas zuweisen, doch den statischen String nicht ausgeben. Eigentlich ist es doch so ähnlich wie bei dir, nur dass es funktionieren sollte <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

string&amp; message()
{
	static string str = &quot;Guten Morgen&quot;;
	return str;
}

int main()
{
	message() = &quot;Guten Abend&quot;;
	string out = message();
	cout &lt;&lt; out &lt;&lt; endl;
}
</code></pre>
<p>Danke für deine Hilfe<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928477</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 10:33:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

string&amp; message()
{
    static string str = &quot;Guten Morgen&quot;;

    return str;
}

int main()
{
    /*
        1.  message() wird aufgerufen und die statische Variable mit &quot;Guten Morgen&quot; initialisiert.

        2.  Dann machst du return-by-reference und weißt der statische Variable dann &quot;Guten Abend&quot; zu.
            --&gt; str := &quot;Guten Abend&quot;

        3.  Dann rufst du wieder message() auf. 
            Die Initialisierungszeile der statischen Variable wird nicht beachtet.
            Diese Zeile wird nur beim aller ersten Funktionsaufruf ausgeführt, danach immer übersprungen.
            --&gt; str bleibt &quot;Guten Abend&quot; --&gt; out ist somit dann auch &quot;Guten Abend&quot;
    */
    message() = &quot;Guten Abend&quot;;

    string out = message();

    cout &lt;&lt; out &lt;&lt; endl; // Ausgabe: Guten Abend

    cin.sync();
    cin.get();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928487</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 10:39:33 GMT]]></title><description><![CDATA[<p>Hallo Dweb,<br />
genau das habe ich ja auch gedacht, doch der Code lässt sich nicht kompilieren. &quot;out&quot; kann icht ausgegeben werden. Stattdessen kommt die folgende Fehlermeldung:</p>
<p>error C2679: Binärer Operator '&lt;&lt;': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
<p>Das verstehe ich nicht, da out doch vom Typ string ist und nur eine Kopie der zurückgegebenen Referenz hat.</p>
<p>Vielen Dank für die tolle Hilfe<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928488</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 10:41:20 GMT]]></title><description><![CDATA[<p><code>#include &lt;string&gt;</code> fehlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928489</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 10:43:14 GMT]]></title><description><![CDATA[<p>Welchen Compiler hast du?</p>
<p>Ich hab hier gerade nur &quot;dev-c++&quot; und er meckert gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928490</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 11:35:48 GMT]]></title><description><![CDATA[<p>Ich stimme dem zu. Inkludiere string.</p>
<p>Übrigens macht es keinen großen Sinn int, char per Referenz zurückzugeben. Das macht nur Sinn, wenn es sich um komplexe Daten handelt. Zum Beispiel eine std::list. Bei großen Datenmengen kann man so den Aufwand des Kopierens sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928521</guid><dc:creator><![CDATA[------]]></dc:creator><pubDate>Mon, 19 Jul 2010 11:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal: const und Referenzen on Mon, 19 Jul 2010 12:10:33 GMT]]></title><description><![CDATA[<p>Oh man...daran lag es. string war echt nich eingebunden. Ich dachte, dass es noch drin war. *grr*, *nochroterwerd*.</p>
<p>Naja, jetzt läuft es aber!</p>
<p>Bis dann<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928540</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 12:10:33 GMT</pubDate></item></channel></rss>