<?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[Übergabewert bei Operatorüberladung?]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich probiere gerade ein bisschen mit Operatorüberladung rum und kapier einfach nicht warum folgendes passiert. Das hier ist meine Test-main:</p>
<pre><code class="language-cpp">int main(void) {
	Vector vec1(4.0,4.0,2.0);
	vec1 *= 1.5;
	vec1.getContent();

	Vector vec2(4.0,4.0,2.0);
	vec2 = vec2 * 1.5;
	vec2.getContent();		

	return EXIT_SUCCESS;
}
</code></pre>
<p>Das hier passiert in meiner Vektorklasse:</p>
<pre><code class="language-cpp">class Vector
{
public:
	Vector(float x, float y, float z) : x(x), y(y), z(z) {}

	virtual ~Vector() {}

	void getContent() { std::cout &lt;&lt; &quot; x: &quot; &lt;&lt; x &lt;&lt; &quot; y: &quot; &lt;&lt; y &lt;&lt; &quot; z: &quot; &lt;&lt; z &lt;&lt; &quot;\n&quot;; }

	inline const Vector operator *= (float scale) {	
		return Vector (	scale * x,
					scale * y,
					scale * z ); 
	}

private:	
	float x,y,z;
};

inline const Vector operator * (float scale, Vector&amp; rhValue) { return rhValue *= scale; } 
inline const Vector operator * (Vector&amp; lhValue, float scale) { return lhValue *= scale; }
</code></pre>
<p>Was ich jetzt nicht versteh ist warum die Ausgabe dazu das hier liefert:</p>
<pre><code>x: 4 y: 4 z: 2
 x: 6 y: 6 z: 3
</code></pre>
<p>Im Prinzip geht das doch alles durch den *= Operator oder? Aber warum kommt das eine bei vec2 an und das andere bei vec1 nicht? Danke schonmal im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>alo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222082/übergabewert-bei-operatorüberladung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 11:38:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222082.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Sep 2008 16:01:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:01:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich probiere gerade ein bisschen mit Operatorüberladung rum und kapier einfach nicht warum folgendes passiert. Das hier ist meine Test-main:</p>
<pre><code class="language-cpp">int main(void) {
	Vector vec1(4.0,4.0,2.0);
	vec1 *= 1.5;
	vec1.getContent();

	Vector vec2(4.0,4.0,2.0);
	vec2 = vec2 * 1.5;
	vec2.getContent();		

	return EXIT_SUCCESS;
}
</code></pre>
<p>Das hier passiert in meiner Vektorklasse:</p>
<pre><code class="language-cpp">class Vector
{
public:
	Vector(float x, float y, float z) : x(x), y(y), z(z) {}

	virtual ~Vector() {}

	void getContent() { std::cout &lt;&lt; &quot; x: &quot; &lt;&lt; x &lt;&lt; &quot; y: &quot; &lt;&lt; y &lt;&lt; &quot; z: &quot; &lt;&lt; z &lt;&lt; &quot;\n&quot;; }

	inline const Vector operator *= (float scale) {	
		return Vector (	scale * x,
					scale * y,
					scale * z ); 
	}

private:	
	float x,y,z;
};

inline const Vector operator * (float scale, Vector&amp; rhValue) { return rhValue *= scale; } 
inline const Vector operator * (Vector&amp; lhValue, float scale) { return lhValue *= scale; }
</code></pre>
<p>Was ich jetzt nicht versteh ist warum die Ausgabe dazu das hier liefert:</p>
<pre><code>x: 4 y: 4 z: 2
 x: 6 y: 6 z: 3
</code></pre>
<p>Im Prinzip geht das doch alles durch den *= Operator oder? Aber warum kommt das eine bei vec2 an und das andere bei vec1 nicht? Danke schonmal im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>alo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578101</guid><dc:creator><![CDATA[alo]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:01:34 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:05:36 GMT]]></title><description><![CDATA[<p>Anstatt dir jetzt die Lösung vorzuschwafeln, gebe ich dir lieber einen Tipp.</p>
<p>Schau mal ganz genau, was du mit den Rückgabewerten machst und was du für Objekte veränderst in der Funktion.<br />
Ist es this, oder ein neues Objekt? Was wird den da Kopiert?</p>
<p>Wenn du das ganz genau anschaust, wirst du merken, wo dein Denkfehler ist. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1578106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578106</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:05:36 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:13:44 GMT]]></title><description><![CDATA[<p>Hmmm...</p>
<p>Die Lösung vorzuschwafeln wäre mir lieber, weil ich irgendwie auf dem Schlauch stehe und jetzt schon etwas länger draufschaue. *g Ich gebe immer ein neues Objekt zurück dachte ich ... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578116</guid><dc:creator><![CDATA[alo]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:13:44 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:30:19 GMT]]></title><description><![CDATA[<p>Versuche das Ganze so zu gestalten:</p>
<pre><code>inline Vector&amp; operator *= (float scale)
{
    x *= scale;
    y *= scale;
    z *= scale;

    return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1578123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578123</guid><dc:creator><![CDATA[alesto]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:30:57 GMT]]></title><description><![CDATA[<p>alo schrieb:</p>
<blockquote>
<p>Ich gebe immer ein neues Objekt zurück dachte ich ... ?</p>
</blockquote>
<p>Ja. Genau. Und das ist ja das Problem.</p>
<pre><code class="language-cpp">Vector vec1(4.0,4.0,2.0);
    vec1 *= 1.5; 
    vec1.getContent();
</code></pre>
<p>Warum erstellst du hier ein neues Objekt und veränderst du das?<br />
Der Sinn von *= ist ja, dass du das Objekt veränderst.<br />
Und zurückgeben solltest du eine Referenz auf this. (bei dir noch nicht problematisch, sondern bei Verkettungen dann.)</p>
<pre><code class="language-cpp">inline const Vector operator *= (float scale) {   
        return Vector (    scale * x,
                    scale * y,
                    scale * z );
    }
</code></pre>
<p>Eher so: (inline ist überflüssig)</p>
<pre><code class="language-cpp">const Vector&amp; operator *= (float scale) { 
    this-&gt;x *= scal;
    this-&gt;y *= scal;
    this-&gt;z *= scal;
    return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1578124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578124</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:30:57 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:39:14 GMT]]></title><description><![CDATA[<p>oh man...</p>
<p>Super viele Dank euch beiden!</p>
<p>Ich versteh aber irgendwie trotzdem nicht, wieso dann der vec2 den richtigen Wert bekommt. Da wird ja genauso ein neues Objekt übergeben? Wäre super, wenn wir ihr mir das noch erklären könntet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578129</guid><dc:creator><![CDATA[alo]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:47:30 GMT]]></title><description><![CDATA[<p>Die Sache ist, dass deine Version der Funktion die Membervariablen x, y, z unverändert lässt. Es erzeugt nur ein neues Objekt und dieses wird dann zurückgegeben. Damit es einen Effekt gibt, musst du in der Funktion die Membervariablen verändern.<br />
Das was zurückgegeben wird spielt eigentlich keine Rolle, es sei denn du willst den Operator auf folgende Weise anwenden:</p>
<p>anderer_vec = vec1 *= 1.5;</p>
<p>dann wird der Rückgabewert des überladenen Operators nach anderer_vec kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578137</guid><dc:creator><![CDATA[alesto]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabewert bei Operatorüberladung? on Sun, 07 Sep 2008 16:54:32 GMT]]></title><description><![CDATA[<p>Aha, ok... prima... Nochmal Danke! Ich glaub ich habs jetzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578141</guid><dc:creator><![CDATA[alo]]></dc:creator><pubDate>Sun, 07 Sep 2008 16:54:32 GMT</pubDate></item></channel></rss>