<?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[Operatoren +, -, *, &#x2F; durch +=, -=, *=, &#x2F;= implementieren oder umgekehrt?]]></title><description><![CDATA[<p>Hi!</p>
<p>Angenommen ich habe eine Klasse, für die ich gerne sowohl +, -, *, / als auch +=, -=, *=, /= bereitstellen will.</p>
<p>+=, -=, *= und /= packe ich in die Klasse rein, die anderen Operatoren mache ich global (so richtig?).</p>
<p>Nun will ich ja nicht alles doppelt haben.<br />
Ich könnte es so machen:</p>
<pre><code class="language-cpp">class Class
{
    // ...

    Class&amp; operator +=(const Class&amp; rhs)
    {
        return *this = *this + rhs;
    }
}

const Class operator +(const Class&amp; lhs, const Class&amp; rhs)
{
    // hier die eigentliche Arbeit machen
}
</code></pre>
<p>Oder umgekehrt:</p>
<pre><code class="language-cpp">class Class
{
    // ...

    Class&amp; operator +=(const Class&amp; rhs)
    {
        // hier die eigentliche Arbeit machen
    }
}

const Class operator +(const Class&amp; lhs, const Class&amp; rhs)
{
    return Class(lhs) += rhs;
}
</code></pre>
<p>Welches davon ist besser?<br />
Was kann der Compiler besser optimieren?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191748/operatoren-durch-implementieren-oder-umgekehrt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 04:35:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191748.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Sep 2007 07:40:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren +, -, *, &#x2F; durch +=, -=, *=, &#x2F;= implementieren oder umgekehrt? on Thu, 06 Sep 2007 07:40:52 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Angenommen ich habe eine Klasse, für die ich gerne sowohl +, -, *, / als auch +=, -=, *=, /= bereitstellen will.</p>
<p>+=, -=, *= und /= packe ich in die Klasse rein, die anderen Operatoren mache ich global (so richtig?).</p>
<p>Nun will ich ja nicht alles doppelt haben.<br />
Ich könnte es so machen:</p>
<pre><code class="language-cpp">class Class
{
    // ...

    Class&amp; operator +=(const Class&amp; rhs)
    {
        return *this = *this + rhs;
    }
}

const Class operator +(const Class&amp; lhs, const Class&amp; rhs)
{
    // hier die eigentliche Arbeit machen
}
</code></pre>
<p>Oder umgekehrt:</p>
<pre><code class="language-cpp">class Class
{
    // ...

    Class&amp; operator +=(const Class&amp; rhs)
    {
        // hier die eigentliche Arbeit machen
    }
}

const Class operator +(const Class&amp; lhs, const Class&amp; rhs)
{
    return Class(lhs) += rhs;
}
</code></pre>
<p>Welches davon ist besser?<br />
Was kann der Compiler besser optimieren?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359928</guid><dc:creator><![CDATA[Strousirup]]></dc:creator><pubDate>Thu, 06 Sep 2007 07:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren +, -, *, &#x2F; durch +=, -=, *=, &#x2F;= implementieren oder umgekehrt? on Thu, 06 Sep 2007 07:43:56 GMT]]></title><description><![CDATA[<p>Ein Vorteil der zweiten Variante, der mir gerade noch eingefallen ist:<br />
Da die eigentliche Rechnung in der Klasse gemacht wird, brauchen die globalen Operatoren nicht als friend deklariert zu werden, weil sie nicht auf die Attribute zugreifen müssen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359931</guid><dc:creator><![CDATA[Strousirup]]></dc:creator><pubDate>Thu, 06 Sep 2007 07:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren +, -, *, &#x2F; durch +=, -=, *=, &#x2F;= implementieren oder umgekehrt? on Thu, 06 Sep 2007 07:46:06 GMT]]></title><description><![CDATA[<p>Natürlich ist die zweite Variante die bessere und die Standardimplementierung, ein operator+ mus immer ein temporäres Objekt erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359934</guid><dc:creator><![CDATA[Offensichtlich]]></dc:creator><pubDate>Thu, 06 Sep 2007 07:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren +, -, *, &#x2F; durch +=, -=, *=, &#x2F;= implementieren oder umgekehrt? on Thu, 06 Sep 2007 07:56:11 GMT]]></title><description><![CDATA[<p>Aber das temporäre Objekt sollte doch heute jeder Compiler wegoptimieren können. Oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359942</guid><dc:creator><![CDATA[Strousirup]]></dc:creator><pubDate>Thu, 06 Sep 2007 07:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren +, -, *, &#x2F; durch +=, -=, *=, &#x2F;= implementieren oder umgekehrt? on Thu, 06 Sep 2007 10:13:24 GMT]]></title><description><![CDATA[<p>Die zweite Variante ist wohl aus den genannten Gründen die bessere. Ein weiterer Vorteil ist, dass man in diesem Fall auf <a href="http://www.boost.org/libs/utility/operators.htm" rel="nofollow">boost.operators</a> zurückgreifen kann. Also mit ..</p>
<pre><code class="language-cpp">#include &lt;boost/operators.hpp&gt;

class Class : public boost::addable&lt; Class &gt;
{
public:
    Class&amp; operator+=( const Class&amp; rhs )
    {
        // hier die eigentliche Arbeit machen
        return *this;
    }
};
</code></pre>
<p>.. wird der operator+( Class a, Class b ) automatisch generiert.</p>
<p>Die Implementierung macht übrigens:</p>
<pre><code class="language-cpp">Class operator+( Class lhs, const Class&amp; rhs )
{
    return lhs += rhs;
}
</code></pre>
<p>siehe dazu auch <a href="http://www.boost.org/libs/utility/operators.htm#symmetry" rel="nofollow">hier</a>.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360089</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 06 Sep 2007 10:13:24 GMT</pubDate></item></channel></rss>