<?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[Konstruktor im Return-Statement funktioniert nicht (Codebeispiel)]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe das Problem, dass zurückgegebene Objekte bei verschachtelten Aufrufen scheinbar ihre Gültigkeit verlieren. Im folgenden ein Codebeispiel (ich habe den ursprünglichen nicht funktionierenden Code sehr gekürzt und zusammengefasst - ich habe alles gelöscht, was mit dem Problem nichts zu tun hat und alle Klassenelemente public deklariert - so ist der Code nun einfacher zu lesen, wenn auch kein sauberer C++-Code mehr):</p>
<p>Eine Klasse 'zahl' beinhaltet ein double-Feld 'wert' und zwei Operatoren +=,*= :</p>
<pre><code>#ifndef __GLEICHUNGEN__ZAHL_H__
#define __GLEICHUNGEN__ZAHL_H__

class zahl
{
	public:
		zahl(double value):wert(value) {}
		double wert;

		//Rechenoperatoren
		zahl &amp;operator+=(const zahl &amp;rvalue);
		zahl &amp;operator*=(const zahl &amp;rvalue);
};

inline zahl &amp;zahl::operator+=(const zahl &amp;rvalue)
{
	wert+=rvalue.wert;
	return *this;
}
inline zahl &amp;zahl::operator*=(const zahl &amp;rvalue)
{
	wert*=rvalue.wert;
	return *this;
}

#endif
</code></pre>
<p>main: Die Funktion main() definiert 3 Instanzen der Klasse zahl und will z1*(z2+z3) mittels der +=,*= - Operatoren ausrechnen.</p>
<pre><code>#include &lt;iostream&gt;

#include &quot;zahl.h&quot;

using std::cout;

const zahl &amp;addition(zahl *_links,zahl *_rechts)
{
	return zahl(_links-&gt;wert)+=*_rechts;
}

const zahl &amp;f1(zahl *z1,zahl *z2,zahl *z3)
{
	return zahl(z1-&gt;wert)*=addition(z2,z3);
}

int main()
{
	zahl z1(3),z2(5),z3(6);

	//z1*(z2+z3)
	std::cout &lt;&lt; f1(&amp;z1,&amp;z2,&amp;z3).wert;
}
</code></pre>
<p>Leider erhalte ich nicht das erwartete Ergebnis 3*(5+6)=33, sondern das Programm gibt eine Zahl mit einer Zehnerpotenz von etwa -300 aus. Vermutlich werden die in den Funktionen f1 bzw addition zurückgegebenen Objekte ungültig.<br />
Wenn ich bei den Konstruktoren in zB f1() das <em>= wegnehme und nur zahl(z1-&gt;wert) zurückgebe, gibt der Compiler einen Fehler aus, dass ein temporäres Objekt zurückgegeben wird. Wieso funktioniert das ganze dann mit dem Operator</em>=?<br />
Und warum funktioniert es nicht? Ich habe mal gelesen, dass man bei Funktionen, welche Objekte zurückgeben, const-Referenzen als Rückgabewert und einen Konstruktor als return-Statement nehmen soll. War das eine Falschinformation?</p>
<p>Gruß,<br />
Heinzi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181009/konstruktor-im-return-statement-funktioniert-nicht-codebeispiel</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 03:14:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181009.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 May 2007 07:37:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor im Return-Statement funktioniert nicht (Codebeispiel) on Wed, 09 May 2007 07:37:52 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe das Problem, dass zurückgegebene Objekte bei verschachtelten Aufrufen scheinbar ihre Gültigkeit verlieren. Im folgenden ein Codebeispiel (ich habe den ursprünglichen nicht funktionierenden Code sehr gekürzt und zusammengefasst - ich habe alles gelöscht, was mit dem Problem nichts zu tun hat und alle Klassenelemente public deklariert - so ist der Code nun einfacher zu lesen, wenn auch kein sauberer C++-Code mehr):</p>
<p>Eine Klasse 'zahl' beinhaltet ein double-Feld 'wert' und zwei Operatoren +=,*= :</p>
<pre><code>#ifndef __GLEICHUNGEN__ZAHL_H__
#define __GLEICHUNGEN__ZAHL_H__

class zahl
{
	public:
		zahl(double value):wert(value) {}
		double wert;

		//Rechenoperatoren
		zahl &amp;operator+=(const zahl &amp;rvalue);
		zahl &amp;operator*=(const zahl &amp;rvalue);
};

inline zahl &amp;zahl::operator+=(const zahl &amp;rvalue)
{
	wert+=rvalue.wert;
	return *this;
}
inline zahl &amp;zahl::operator*=(const zahl &amp;rvalue)
{
	wert*=rvalue.wert;
	return *this;
}

#endif
</code></pre>
<p>main: Die Funktion main() definiert 3 Instanzen der Klasse zahl und will z1*(z2+z3) mittels der +=,*= - Operatoren ausrechnen.</p>
<pre><code>#include &lt;iostream&gt;

#include &quot;zahl.h&quot;

using std::cout;

const zahl &amp;addition(zahl *_links,zahl *_rechts)
{
	return zahl(_links-&gt;wert)+=*_rechts;
}

const zahl &amp;f1(zahl *z1,zahl *z2,zahl *z3)
{
	return zahl(z1-&gt;wert)*=addition(z2,z3);
}

int main()
{
	zahl z1(3),z2(5),z3(6);

	//z1*(z2+z3)
	std::cout &lt;&lt; f1(&amp;z1,&amp;z2,&amp;z3).wert;
}
</code></pre>
<p>Leider erhalte ich nicht das erwartete Ergebnis 3*(5+6)=33, sondern das Programm gibt eine Zahl mit einer Zehnerpotenz von etwa -300 aus. Vermutlich werden die in den Funktionen f1 bzw addition zurückgegebenen Objekte ungültig.<br />
Wenn ich bei den Konstruktoren in zB f1() das <em>= wegnehme und nur zahl(z1-&gt;wert) zurückgebe, gibt der Compiler einen Fehler aus, dass ein temporäres Objekt zurückgegeben wird. Wieso funktioniert das ganze dann mit dem Operator</em>=?<br />
Und warum funktioniert es nicht? Ich habe mal gelesen, dass man bei Funktionen, welche Objekte zurückgeben, const-Referenzen als Rückgabewert und einen Konstruktor als return-Statement nehmen soll. War das eine Falschinformation?</p>
<p>Gruß,<br />
Heinzi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281339</guid><dc:creator><![CDATA[Heinzisoft]]></dc:creator><pubDate>Wed, 09 May 2007 07:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Return-Statement funktioniert nicht (Codebeispiel) on Wed, 09 May 2007 07:49:04 GMT]]></title><description><![CDATA[<p>Da hast du Unsinn gelesen. Die zurückgegebenen Referenzen verweisen auf Objekte, die nach dem Ende der Funktion sofort zerstört werden - und damit naturgemäß auf undefinierte Speicherbereiche. Übrigens ist es unsinnig, deine Objekte per Zeiger an die Funktionen zu übergeben.</p>
<p>(da ist es besser, neben den bisherigen Operatoren auch + und * zu überladen - dann brauchst du deine Funktionen überhaupt nicht mehr:</p>
<pre><code class="language-cpp">zahl operator +(zahl r, zahl l)
{ return r+=l; }
zahl operator *(zahl r, zahl l)
{ return r*=l; }

...
cout&lt;&lt;z1*(z2+z3)&lt;&lt;endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1281346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281346</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 09 May 2007 07:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Return-Statement funktioniert nicht (Codebeispiel) on Wed, 09 May 2007 08:12:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das Beispiel ist nur Unsinn, weil ich es so gekürzt habe. Die Zeiger brauche ich, da es im eigentlichen Programm Zeiger auf eine Basisklasse sind. Ich habe im Programm auch die Operatoren +,* definiert, welche folgendermaßen aussehen:</p>
<pre><code>template&lt;class T&gt;
   const T operator+(const T&amp; lhsObj,const T&amp; rhsObj)
   {
      return T(lhsObj) += rhsObj; //return von Konstruktor
   }
</code></pre>
<p>Dieses Codebeispiel ist aus &quot;Notizen zu C++&quot; von Peter Thömmes (Version: 09. August 2003) Seite 196/197: <a href="http://www.astro.uni-wuerzburg.de/~asmaier/usefulthings/c++.pdf" rel="nofollow">http://www.astro.uni-wuerzburg.de/~asmaier/usefulthings/c++.pdf</a><br />
Hier funktioniert es mit der Rückgabe der Referenzen. Soweit ich weiß, heißt die Technik return value optimization und ist eine Compilererweiterung, welche dafür sorgt, dass in Funktionen, welche lokale Objekte zurückgeben müssen, diese nicht zuerst in der Funktion und dann nochmal bei der Rückgabe neu konstruiert werden.<br />
Da ich mit dem GCC compiliere und dieser die entsprechende Compilererweiterung normalerweise hat, dürfte es kein Problem geben.<br />
Das Problem entsteht irgendwie erst, wenn ich die zurückgegebenen Objekte gleich weiter an Funktionen übergebe.</p>
<p>Gruß,<br />
Heinzi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281368</guid><dc:creator><![CDATA[Heinzisoft]]></dc:creator><pubDate>Wed, 09 May 2007 08:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Return-Statement funktioniert nicht (Codebeispiel) on Wed, 09 May 2007 08:15:58 GMT]]></title><description><![CDATA[<p>Mal ganz platt gefragt: Wo siehst Du in dem Codebeispiel die Rückgabe von Referenzen? Hier wird by-value zurückgegeben. Genau das musst Du in Deinem Code auch tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281370</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 09 May 2007 08:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Return-Statement funktioniert nicht (Codebeispiel) on Wed, 09 May 2007 08:26:53 GMT]]></title><description><![CDATA[<p>Ich depp - du hast recht...da wird ja tatsächlich by value zurückgegeben...das habe ich irgendwie übersehen.<br />
Funktioniert die return value optimization also, wenn ich ein Objekt by value zurückgebe?</p>
<p>Gruß,<br />
Heinzi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281375</guid><dc:creator><![CDATA[Heinzisoft]]></dc:creator><pubDate>Wed, 09 May 2007 08:26:53 GMT</pubDate></item></channel></rss>