<?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 überladen]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Ich habe nun eine ganz leichte Klasse &quot;Zwei&quot; geschrieben, welche nur zwei Integerwerte hat.<br />
Für diese Klasse habe ich einen Operator &quot;operator+&quot; definiert, welcher beide Integerwerte einfach addiert und dann ein &quot;Zwei&quot;-Objekt zurückliefert.<br />
Nun kann ich folgendermaßen vorgehen:</p>
<p>Zwei Z(3,4);<br />
Zwei U(4,5);<br />
Zwei O();<br />
O = Z+U;</p>
<p>Nun hat '0' die Werte 7 und 9.<br />
Soweit so gut.</p>
<p>Blöd wird es, wenn ich die Operatorfunktion explizit aufrufe, was ja auch geht:</p>
<p>O = O.operator+(Z,U);</p>
<p>Im Prinzip sollte das ja haargenau das selbe machen, es funktioniert jedoch nicht, weil 'Z' nun nicht als impliziter Parameter &quot;this&quot; geschluckt wird.</p>
<p>Ich kann also bei dieser Schreibweise nur zu O einen Wert hinzuaddieren, wo ich vorher zwei völlig andere Objekte addieren konnte, deren Ergebnis in O gespeichert wurde.</p>
<p>Zwar ist die obere Schreibweise sowieso besser, mich wundert dennoch, warum die zweitere nicht auch funktioniert.<br />
Ist es einfach so, dass die implizite Schreibweise den ersten der Parameter gleich mit &quot;this&quot; verknüpft, oder wie genau muss ich mir das vorstellen?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204127/operatoren-überladen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 08:50:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204127.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jan 2008 14:30:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren überladen on Wed, 30 Jan 2008 14:30:04 GMT]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Ich habe nun eine ganz leichte Klasse &quot;Zwei&quot; geschrieben, welche nur zwei Integerwerte hat.<br />
Für diese Klasse habe ich einen Operator &quot;operator+&quot; definiert, welcher beide Integerwerte einfach addiert und dann ein &quot;Zwei&quot;-Objekt zurückliefert.<br />
Nun kann ich folgendermaßen vorgehen:</p>
<p>Zwei Z(3,4);<br />
Zwei U(4,5);<br />
Zwei O();<br />
O = Z+U;</p>
<p>Nun hat '0' die Werte 7 und 9.<br />
Soweit so gut.</p>
<p>Blöd wird es, wenn ich die Operatorfunktion explizit aufrufe, was ja auch geht:</p>
<p>O = O.operator+(Z,U);</p>
<p>Im Prinzip sollte das ja haargenau das selbe machen, es funktioniert jedoch nicht, weil 'Z' nun nicht als impliziter Parameter &quot;this&quot; geschluckt wird.</p>
<p>Ich kann also bei dieser Schreibweise nur zu O einen Wert hinzuaddieren, wo ich vorher zwei völlig andere Objekte addieren konnte, deren Ergebnis in O gespeichert wurde.</p>
<p>Zwar ist die obere Schreibweise sowieso besser, mich wundert dennoch, warum die zweitere nicht auch funktioniert.<br />
Ist es einfach so, dass die implizite Schreibweise den ersten der Parameter gleich mit &quot;this&quot; verknüpft, oder wie genau muss ich mir das vorstellen?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446371</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Wed, 30 Jan 2008 14:30:04 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Wed, 30 Jan 2008 14:33:52 GMT]]></title><description><![CDATA[<p>Das zweite ist etwas ganz anderes. Du meinst wohl eher <code>O = Z.operator+(U);</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446374</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 30 Jan 2008 14:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Wed, 30 Jan 2008 14:35:01 GMT]]></title><description><![CDATA[<p>Naja operator+ als Friend anlegen und du kommst da weiter ... in deinem Fall wäre korrekt:</p>
<pre><code class="language-cpp">foo first(1U, 2U);
foo second(3U, 4U);
foo result = first.operator+(second); /* first + second; */// (4U, 6U)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1446375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446375</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 30 Jan 2008 14:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Wed, 30 Jan 2008 15:59:29 GMT]]></title><description><![CDATA[<p>Meine Güte... ist ja richtig *sich selbst gegen die Stirm schlag*^^<br />
Thx <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="😉"
    /><br />
Werds gleich mal testen...-.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446439</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Wed, 30 Jan 2008 15:59:29 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Wed, 30 Jan 2008 16:08:50 GMT]]></title><description><![CDATA[<p>gerade wenn du implizite Konvertierungen von einem anderen Datentyp nach &quot;zwei&quot; zulassen willst, solltest du den operator+ nicht als Memberfunktion machen sondern als freie Funktion. Und da es sowieso meist zum guten Stil gehoert, zum operator + noch den Operator += zu liefern, kann man letzteren nutzen um ersteren zu implementieren, ganz ohne friends:</p>
<pre><code class="language-cpp">class Zwei 
{
public:
  Zwei&amp; operator+= (Zwei const&amp; rhs)
    { x+=rhs.x; y+=rhs.y; return *this; }
private:
 int x, y;
};

Zwei operator+ (Zwei const&amp; lhs, Zwei const&amp; rhs)
{
  Zwei result(lhs);
  return result += rhs;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1446447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446447</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 30 Jan 2008 16:08:50 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 07:47:11 GMT]]></title><description><![CDATA[<p>Also um alles nochmal zusammenzufassen:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;
class Operatoren
{
   private:
      int a;
      int b; 
   public: 
      void seta(int);
      void setb(int);
      int geta(void);
      int getb(void);               
      Operatoren(int c, int d)
      {
         a = c;
         b = d;               
      }
      Operatoren&amp; operator+=(const Operatoren&amp; op)
      {
         a += op.a;
         b += op.b;
         return *this;           
      }
};
void Operatoren::seta(int aa)
{
   a = aa;
}
void Operatoren::setb(int bb)
{
   b = bb;
}
int Operatoren::geta(void)
{
   return a;   
}
int Operatoren::getb(void)
{
   return b;   
}
Operatoren operator+(const Operatoren&amp; op1, const Operatoren&amp; op2)
{
   Operatoren result(op1);
   return (result+=op2);
}
int main(void)
{
   Operatoren O(3,4);
   Operatoren U(7,4);
   Operatoren Z(3,4);
   Operatoren Y(3,4);
   Y = operator+(U,O);
   cout &lt;&lt; U.geta() &lt;&lt; endl &lt;&lt; U.getb() &lt;&lt; endl &lt;&lt; O.geta() &lt;&lt; endl &lt;&lt; O.getb() &lt;&lt; endl &lt;&lt; endl;
   system(&quot;Pause&quot;);
}
</code></pre>
<p>Das ist ein kompletter Funktionierender Quelltext.<br />
Pumukls Tip ist echt nicht schlecht - das funktioniert auch.<br />
Ich habe aber dennoch zu meinem eigenen Quelltext nochmal nen paar Fragen- auch wenn der jetzt funktioniert:</p>
<p>1. Also stimmt es, dass der + Operator am besten niemals Klassenelement ist, da er somit das das eigene Objekt verändert, obwohl der Benutzer der Klasse vielleicht nur wissen möchte, was die zwei Klassen zusammen sind.<br />
Der += Operator sollte aber immer Element der Klasse sein, weil der zum +Operator gehört und es auch nicht schlimm ist, dass er das temporäre Objekt verändert. Die eigentlichen Operanen bleiben ja gleich.</p>
<p>2. Ich habe noch ne allgemeine Frage. Funktionen welche einen Zeiger auf &quot;*this&quot; zurückgeben haben als Rückgabetyp irgendwie immer eine Referenz und keinen Zeiger. Obwohl doch der Rückgabetyp ganz klar ein Zeiger ist. Sobald ich den Rückgabetyp aber auf Zeiger ändere spuckt der Compiler einen Fehler aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /><br />
Woran liegt das?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446775</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 31 Jan 2008 07:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 08:04:13 GMT]]></title><description><![CDATA[<p>zu 2. this ist ein Pointer, richtig. *this dereferenziert ihn aber, so daß du das eigentliche Objekt hast. Und das wird als Referenz zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446783</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 31 Jan 2008 08:04:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 08:11:01 GMT]]></title><description><![CDATA[<p>ahh.. ja super <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="😉"
    /><br />
Das reicht mir schon als Erklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446790</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 31 Jan 2008 08:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 15:19:24 GMT]]></title><description><![CDATA[<p>Ich habe zum Ende noch eine Frage.<br />
Und zwar hab ich gerade im Netz gelesen, dass es nicht möglich ist eigene Operatorzeichen neu hinzuzufügen.<br />
Also, dass Beispielsweise jetzt der Operator &lt;!&gt;, den es ja bisher noch garnicht gibt so benutzt werden könnte:</p>
<pre><code>Objekt3 = Objekt1 &lt;!&gt; Objekt2
</code></pre>
<p>In meinem Buch steht ein Satz, welcher sagt, dass man Operatoren wie == immer verwenden soll, wenn es sinnvoll erscheint ohne eigene erfundene Namen zu nehmen.<br />
Das hiesse ja, dass das Buch davon ausgeht, dass es doch geht nen eigenes Operatorzeichen zu erstellen.</p>
<p>In Pearl geht das ja auch- warum also nicht in C++?<br />
Kann mir darüber noch jemand Klarheit verschaffen?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447084</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 31 Jan 2008 15:19:24 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 16:50:19 GMT]]></title><description><![CDATA[<p>Geht in C++ nicht. Warum auch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447155</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 31 Jan 2008 16:50:19 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 17:11:04 GMT]]></title><description><![CDATA[<p>Wenn dein Buch sagt, dass du einen in C++ bereits vorhandene operator wie == (Vergleichsoperator) da benutzen sollst, wo er sinn macht, heißt das doch noch lange nicht, dass es davon ausgeht, dass man neue operatoren definieren kann oder? <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/1447170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447170</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jan 2008 17:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 20:56:58 GMT]]></title><description><![CDATA[<p>ochjo- war etwas in die Richtung formuliert, weil da halt stand, 'statt einen Phantasienamen zu nehmen, sollte man gleich ein sinnvolles Zeichen nehmen' oder so.<br />
Aber wenns nicht geht auch okay^^<br />
Thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447288</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 31 Jan 2008 20:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren überladen on Thu, 31 Jan 2008 23:05:34 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>1. Also stimmt es, dass der + Operator am besten niemals Klassenelement ist, da er somit das das eigene Objekt verändert, obwohl der Benutzer der Klasse vielleicht nur wissen möchte, was die zwei Klassen zusammen sind.</p>
</blockquote>
<p>So radikal kann man das auch nicht sagen, dass er &quot;niemals&quot; Klassenelement sein darf. Aber es ist im Allgemeinen richtig, dass er außerhalb der Klasse deklariert sein sollte, um mögliche implizite Konvertierungen des ersten Operanden zu erlauben. Das eigene Objekt verändert der operator+ auch als Klassenelement nicht, wenn man ihn richtig definiert und implementiert. Ein operator+ als Klassenelement sollte const sein und muss ein neues Objekt zurückgeben (zeiger wären unintuitiv und Referenzen gehen auch nicht.)</p>
<blockquote>
<p>Der += Operator sollte aber immer Element der Klasse sein, weil der zum +Operator gehört und es auch nicht schlimm ist, dass er das temporäre Objekt verändert. Die eigentlichen Operanen bleiben ja gleich.</p>
</blockquote>
<p>operator += MUSS meines Wissens immer Element der Klasse sein, einen freien operator+= gibt es nicht. (wäre auch wenig sinnvoll)</p>
<p>777 schrieb:</p>
<blockquote>
<p>ochjo- war etwas in die Richtung formuliert, weil da halt stand, 'statt einen Phantasienamen zu nehmen, sollte man gleich ein sinnvolles Zeichen nehmen' oder so.<br />
Aber wenns nicht geht auch okay^^<br />
Thx</p>
</blockquote>
<p>Naja, die &quot;sinnvollen&quot; Zeichen gibts ja alle schon - wobei sinnvoll in dem Falle wäre, dass sie bereits bekannt sind und jeder weiß was man damit anfangen kann (weshalb man operatoren nur für die aktionen definieren sollte, die man auch dahinter vermuten würde). Für mich persönlich sieht &quot;&lt;!&gt;&quot; nach einem Phantasie-operator aus, da kann man genausogut eine Funktion mit Phantasienamen nehmen <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>Etwas OT: Ich hatte mal überlegt, ob es möglich wäre, in C++ den ** -operator aus FORTRAN zu simulieren (Exponentialoperator) Mein bester Ansatz bisher:</p>
<pre><code class="language-cpp">class Exponent {
public:
  class Exponentproxy {
    Exponentproxy(double ex) : ex(ex) {}
    double const ex;

    friend Exponent::Exponent(double);
    friend double operator*(double, Exponentproxy const&amp;);
  }

  Exponent(double ex) : proxy(ex) {}
  Exponentproxy const&amp; operator* ()
   {return proxy;}
private:
  Exponentproxy const proxy;
}
double operator*(double lhs, Exponent::Exponentproxy const&amp; rhs)
{
  return pow(lhs, rhs.ex);
}
</code></pre>
<p>Sinn der Sache: Die Anwedung des operator* auf einen Exponenten liefert einen Proxy, und die Mutliplikation mit dem Proxy liefert die entsprechende Potenz.<br />
Da im Proxy ALLES private ist, kann nur ein Exponent einen Proxy erstellen und nur der operator* kann auf den Inhalt zugreifen. Der einzige Schönheitsfehler (außer den fehlenden privaten copy-Ctor und op=) den ich biser sehe ist, dass die Compiler leider keine implizite Konvertierung von double nach Exponent vornehmen:</p>
<pre><code class="language-cpp">double a,b;
double c = a**b; //FEHLER: b wird nicht implizit in exponent konvertiert
double c = a**Exponent(b); //sollte gehn, aber pow ist kürzer...
</code></pre>
<p>Man könnte sowas daher bestenfalls als Spielerei in eine eigene Zahlenklasse einbauen, um den Operator** zu erlauben.</p>
<p>PS: ich habs nicht getestet, wenn jemand große Denkfehler entdeckt bitte melden <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/1447335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447335</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jan 2008 23:05:34 GMT</pubDate></item></channel></rss>