<?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[Referenz als Rückgabetyp]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich wiederhole gerade Funktionen, die als Rückgabetyp eine Referenz hat. Nun frage ich mich, wann es sich lohnt, eine Referenz zurückzugeben.</p>
<p>Wenn ich eine Referenz als Parameter übergebe und diese dann verändere, dann benötige ich selbstverständlich keinen Rückgabewert, da durch das Ändern der Referenz auch die Variable geändert wird.</p>
<p>Wenn ich in der Methode selbst ein Objekt definiere und dieses als Referenz zurückgebe, dann muss dieses static sein, denn sonst ist die Referenz nicht mehr initialisiert. Das sähe dann so aus:</p>
<pre><code class="language-cpp">string&amp; foo()
{
 static str = &quot;Hello World&quot;; // static ist Pflicht
 return str;
}

int main()
{
 cout &lt;&lt; foo;
}
</code></pre>
<p>Ich schätze mal, dass letzterer Fall eher schlecht ist. Könnt ihr mir ein gutes Beispiel geben, wann eine Funktion wirklich eine Referenz als Rückgabetyp haben sollte?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270784/referenz-als-rückgabetyp</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 23:03:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270784.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Jul 2010 10:36:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:37:36 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich wiederhole gerade Funktionen, die als Rückgabetyp eine Referenz hat. Nun frage ich mich, wann es sich lohnt, eine Referenz zurückzugeben.</p>
<p>Wenn ich eine Referenz als Parameter übergebe und diese dann verändere, dann benötige ich selbstverständlich keinen Rückgabewert, da durch das Ändern der Referenz auch die Variable geändert wird.</p>
<p>Wenn ich in der Methode selbst ein Objekt definiere und dieses als Referenz zurückgebe, dann muss dieses static sein, denn sonst ist die Referenz nicht mehr initialisiert. Das sähe dann so aus:</p>
<pre><code class="language-cpp">string&amp; foo()
{
 static str = &quot;Hello World&quot;; // static ist Pflicht
 return str;
}

int main()
{
 cout &lt;&lt; foo;
}
</code></pre>
<p>Ich schätze mal, dass letzterer Fall eher schlecht ist. Könnt ihr mir ein gutes Beispiel geben, wann eine Funktion wirklich eine Referenz als Rückgabetyp haben sollte?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1927993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1927993</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:37:36 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:38:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class MyClass
{
    MyClass&amp; operator= (const MyClass&amp;);
}

MyClass&amp; MyClass::operator= (const MyClass&amp;)
{
    ...
    return this;
}

// ermöglicht:
a = a = b;
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1927996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1927996</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:38:55 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:45:25 GMT]]></title><description><![CDATA[<p>Danke für das Beispiel. Das ist einleuchtend. Aber dann müssen doch &quot;a&quot; und &quot;b&quot; vom Typ MyClass sein?</p>
<p>Ich habe noch eine andere Frage. Mein Lehrbuch sagt, dass eine Referenz keinen Speicherplatz benötigt, da es sich dabei eben nur um einen Aliasnamen handelt. Doch irgendwo muss doch auch der Name der Referenz und das referenzierte Objekt gespeichert sein. Wie hat man das zu verstehen, dass hier kein Speicherplatz benötigt wird?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1927997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1927997</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:47:12 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ich schätze mal, dass letzterer Fall eher schlecht ist. Könnt ihr mir ein gutes Beispiel geben, wann eine Funktion wirklich eine Referenz als Rückgabetyp haben sollte?</p>
</blockquote>
<p>Das trifft man oft bei Memberfunktionen an, aber nicht nur. Beispiele (nicht ganz korrekte C++-Syntax):</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T&amp; std::vector&lt;T&gt;::operator[] (size_t index);

template &lt;typename T&gt;
const T&amp; std::max(const T&amp; lhs, const T&amp; rhs);

const std::string&amp; Person::GetName() const;
</code></pre>
<p>Oft will man mit Referenzen auf <code>const</code> nur die Kopie sparen. Bei Referenzen auf veränderliche Objekte erlaubt man Modifikationen des referenzierten Objekts, z.B. bei</p>
<pre><code class="language-cpp">myVector[3] = 5;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1927998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1927998</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:49:37 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Mein Lehrbuch sagt, dass eine Referenz keinen Speicherplatz benötigt, da es sich dabei eben nur um einen Aliasnamen handelt. Doch irgendwo muss doch auch der Name der Referenz und das referenzierte Objekt gespeichert sein. Wie hat man das zu verstehen, dass hier kein Speicherplatz benötigt wird?</p>
</blockquote>
<p>Dein Lehrbuch ist nicht ganz richtig. Es ist vom Standard nicht vorgeschrieben, ob eine Referenz Speicher benötigt oder nicht. In vielen Fällen muss dies so sein, teilweise kann aber auch die Referenz gleich durch das Originalobjekt ersetzt werden.</p>
<p>Für den Programmierer ist diese Frage aber irrelevant, da er ohnehin keine Möglichkeit hat, auf den Speicher der Referenz zuzugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928000</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:54:08 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class MyClass
{
    MyClass&amp; operator= (const MyClass&amp;);
}

MyClass&amp; MyClass::operator= (const MyClass&amp;)
{
    ...
    return this;
}

// ermöglicht:
a = a = b;
</code></pre>
<p>MfG SideWinder</p>
</blockquote>
<pre><code class="language-cpp">MyClass&amp; MyClass::operator= (const MyClass&amp;)
{
    ...
    return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928003</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 10:58:59 GMT]]></title><description><![CDATA[<p>SUUUPER! Ich verstehe ;).</p>
<p>Nun soll eigentlich folgender Code eine Fehlermeldung ausgeben, doch mein Compiler findet keinen. Könntet ihr mir sagen, ob ich mit meinem Verständnis richtig liege?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int&amp; max(int x, int y)
{
	return x &gt; y ? x : y;
}

int main()
{ 
	cout &lt;&lt; max(5,6);
}
</code></pre>
<p>Zunächst werden zwei Objekte in die Funktion &quot;max&quot; kopiert (es werden also neue temporäre Objekte angelegt, da die Übergabge per Call by Value stattfindet). Es wird eine Fallunterscheidung durchgeführt. Nun wird das lokale Objekt, welches durch den Kopiervorgang entstanden ist, referenziert und zurückgegeben. Eigenlich müsste das doch auch static sein, denn am Ende der Funktion wird das Objekt wieder gelöscht. Warum funktioniert der Code dann?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928004</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 18 Jul 2010 10:58:59 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:00:28 GMT]]></title><description><![CDATA[<p>Syntaktisch ist er korrekt. Alles, was du von einem Compiler erwarten kannst ist eine Warning.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928007</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:00:31 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Danke für das Beispiel. Das ist einleuchtend. Aber dann müssen doch &quot;a&quot; und &quot;b&quot; vom Typ MyClass sein?</p>
</blockquote>
<p>Jain...<br />
Syntaktisch kann b auch ein Objekt sein, das von A erbt,<br />
jedoch geht das inhaltlich (eigentlich immer) schief...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928008</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:03:15 GMT]]></title><description><![CDATA[<p>Aber die Objekte in der Funktion werden doch beim Ende wieder gelöscht. Warum können diese dann ohne static referenziert werden und außerhalb der FUnktion verwendet werden?</p>
<p>@manni66: An den Fall habe ich nicht gedacht, doch das ist auch nicht der Alltag bei mir xD xD</p>
<p>Danke!!!<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928013</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:04:35 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Warum funktioniert der Code dann?</p>
</blockquote>
<p>Es wurde dir doch auch schon gesagt, dass du bei undefiniertem Verhalten keine Rückschlüsse auf die Korrektheit ziehen darfst. Der Code ist falsch.</p>
<p>Richtig wäre</p>
<pre><code class="language-cpp">int&amp; max(int&amp; x, int&amp; y)
{
    return x &gt; y ? x : y;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928014</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:05:48 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Aber die Objekte in der Funktion werden doch beim Ende wieder gelöscht. Warum können diese dann ohne static referenziert werden und außerhalb der FUnktion verwendet werden?</p>
</blockquote>
<p>Richtig... Genau das ist das Problem...<br />
Dein Objekt ist gelöscht, aber deine Referenz verweist noch auf den Speicherbereich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928015</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:09:05 GMT]]></title><description><![CDATA[<p>Ok, ich hätte nicht gededacht, dass das auch undefiniertes Verhalten ist. Für mich sieht es rein optisch nämlich noch sehr definiert aus. Aber wenn ihr das auch so seht, dann bin ich ja beruhigt! Ich hätte erwartet, dass irgendein Murks ausgegeben wird oder dass eine Fehlermeldung erscheint.</p>
<p>Vielen Dank für die Erklärungen!<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928018</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:14:35 GMT]]></title><description><![CDATA[<p>Das ist ja das Gefährliche: Man sieht undefiniertes Verhalten oft erst spät oder gar nicht. Deshalb <strong>nie</strong> darauf verlassen, dass es kracht, sondern den Code im Zweifelsfalle selbst auf Korrektheit überprüfen.</p>
<p>Zum Beispiel kann ein nicht initialisierter Zeiger auf gültigen Speicher zeigen, wodurch Zugriffe andere Daten der Applikation beeinträchtigen können. Sowas resultiert oft in extrem mühsamen und schwer nachvollziehbaren Bugs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928021</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:17:03 GMT]]></title><description><![CDATA[<p>Stimmt! Deswegen sind logische Fehler meiner Ansicht nach auch die schlimmsten. Syntaktische dagegen können einfach behoben werden und man wird sogar bis zur entsprechenden Zeile befördert.</p>
<p>Aber nunja! Wieder was gelernt.</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928022</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:17:03 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz als Rückgabetyp on Sun, 18 Jul 2010 11:36:10 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ich hätte erwartet, dass irgendein Murks ausgegeben wird oder dass eine Fehlermeldung erscheint.</p>
</blockquote>
<p>Erstell vor der Ausgabe noch ein paar Objekte auf dem Stack und dein Inhalt ist dann überschrieben.<br />
Dann gibt er dir auch Murks 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="😉"
    /></p>
<p>Eine Laufzeit-Fehlermeldung gibt es (sehr wahrscheinlich), wenn dort ein Zeiger<br />
war und du über den Zeiger danach wieder auf das Objekt zugreifen möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928031</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 18 Jul 2010 11:36:10 GMT</pubDate></item></channel></rss>