<?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[Überladene Operatoren...]]></title><description><![CDATA[<p>Hallo, ich habe folgende Varianten um einen Vektor <strong>v</strong> zu einem Punkt <strong>p</strong> zu addieren und einen neuen Punkt <strong>r</strong> zu erhalten.</p>
<pre><code class="language-cpp">a)       inline Point3D&lt;T&gt; operator+ (Vector3D&lt;T&gt; v);

 b)       friend Point3D&lt;T&gt; operator+  &lt;&gt;(Point3D&lt;T&gt; a, Vector3D&lt;T&gt; b);
 c)       friend Point3D&lt;T&gt; operator+  &lt;&gt;(Vector3D&lt;T&gt; a, Point3D&lt;T&gt; b);
</code></pre>
<p>Wann wird hier eigentlich welche Überladung aufgerufen?<br />
Sind die unteren Beiden durch die Erstere nicht eigentlich überflüssig?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/124098/überladene-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 20:17:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/124098.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Oct 2005 18:49:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladene Operatoren... on Sun, 23 Oct 2005 18:49:51 GMT]]></title><description><![CDATA[<p>Hallo, ich habe folgende Varianten um einen Vektor <strong>v</strong> zu einem Punkt <strong>p</strong> zu addieren und einen neuen Punkt <strong>r</strong> zu erhalten.</p>
<pre><code class="language-cpp">a)       inline Point3D&lt;T&gt; operator+ (Vector3D&lt;T&gt; v);

 b)       friend Point3D&lt;T&gt; operator+  &lt;&gt;(Point3D&lt;T&gt; a, Vector3D&lt;T&gt; b);
 c)       friend Point3D&lt;T&gt; operator+  &lt;&gt;(Vector3D&lt;T&gt; a, Point3D&lt;T&gt; b);
</code></pre>
<p>Wann wird hier eigentlich welche Überladung aufgerufen?<br />
Sind die unteren Beiden durch die Erstere nicht eigentlich überflüssig?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/899521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899521</guid><dc:creator><![CDATA[Tobain]]></dc:creator><pubDate>Sun, 23 Oct 2005 18:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to Überladene Operatoren... on Sun, 23 Oct 2005 19:28:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>1. Ich finde deine Überladungen zwar irgendwie sehr strange, aber ich weiß ja nicht was du vor hast...<br />
2. Es wäre ganz praktisch zu wissen, in welcher Klasse die erste Methode deklariert ist.</p>
<p>a) 1. Falls diese in Point3D deklariert ist (wovon ich ausgehe), so wird sie aufgerufen, wenn der linke Operand vom Typ Point3D <em>und</em> der rechte Operand vom Typ Vector3D ist.</p>
<p>a) 2. Falls diese in Vector3D deklariert ist, so wird sie aufgerufen, wenn der linke Operand vom Typ Vectort3D <em>und</em> der rechte Operand vom Typ Vector3D ist.</p>
<p>b) und c) sollten klar sein... D.h. wenn a) zutrift, ist b) überflüssig (sofern keine eventuellen Konvertierungen des linken Arguments stattfinden sollen).</p>
<p>Btw: Falls Vector3D noch von Point3D abgeleitet ist (was zwar imho einen Designfehler andeutet; ich aber dunkel in Erinnerung habe, dass du diese Klassen so Beziehung zueinander gesetzt hast... ;)), <em>könnte</em> (man beachte das Wort &quot;könnte&quot;) auch c) überflüssig sein.</p>
<p>Und jetzt noch eine Frage: Warum übergibst du die Argumente per value?</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899560</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Überladene Operatoren... on Sun, 23 Oct 2005 20:25:56 GMT]]></title><description><![CDATA[<blockquote>
<p>2. Es wäre ganz praktisch zu wissen, in welcher Klasse die erste Methode deklariert ist.</p>
</blockquote>
<p>Sie ist in der Klasse Point3D deklariert und ich arbeite mich gerade in dieses Thema/C++ ein, da ich von der Java-Welt herüberkomme <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<blockquote>
<p>a) 1. Falls diese in Point3D deklariert ist (wovon ich ausgehe), so wird sie aufgerufen, wenn der linke Operand vom Typ Point3D und der rechte Operand vom Typ Vector3D ist.</p>
</blockquote>
<p>Das ist sehr schön zu wissen, dann funktioniert hier also nur p+v und nicht v+p, wenn ich dich richtig verstanden habe.</p>
<blockquote>
<p>b) und c) sollten klar sein... D.h. wenn a) zutrift, ist b) überflüssig (sofern keine eventuellen Konvertierungen des linken Arguments stattfinden sollen).</p>
</blockquote>
<p>Den Anfang habe ich verstanden, allerdings mache ich mir um den Ausdruck in der Klammer (deiner Klammer) sorgen. Ist es da irgendwie möglich Objekte automatisch zu casten?</p>
<blockquote>
<p>Btw: Falls Vector3D noch von Point3D abgeleitet ist (was zwar imho einen Designfehler andeutet; ich aber dunkel in Erinnerung habe, dass du diese Klassen so Beziehung zueinander gesetzt hast... ;)), könnte (man beachte das Wort &quot;könnte&quot;) auch c) überflüssig sein.</p>
</blockquote>
<p>Nein Vector3D und Point3D sind beides unabhängige Klassen, nur das aus den Berechnungen mal die oder die Klasse entstehen kann.</p>
<blockquote>
<p>Und jetzt noch eine Frage: Warum übergibst du die Argumente per value?</p>
</blockquote>
<p>Vermutlich weil ich doch noch keine Ahnung von C/C++ habe. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
In Java ist ja bekanntlich jedes Objekt immer Call by Reference...<br />
Wäre es so besser?</p>
<pre><code class="language-cpp">friend Point3D&lt;T&gt;&amp; operator+  &lt;&gt;(Point3D&lt;T&gt;&amp; a, Vector3D&lt;T&gt;&amp; b);
</code></pre>
<p>mfG Tobain</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899617</guid><dc:creator><![CDATA[Tobain]]></dc:creator><pubDate>Sun, 23 Oct 2005 20:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Überladene Operatoren... on Sun, 23 Oct 2005 21:53:01 GMT]]></title><description><![CDATA[<p>Tobain schrieb:</p>
<blockquote>
<blockquote>
<p>a) 1. Falls diese in Point3D deklariert ist (wovon ich ausgehe), so wird sie aufgerufen, wenn der linke Operand vom Typ Point3D und der rechte Operand vom Typ Vector3D ist.</p>
</blockquote>
<p>Das ist sehr schön zu wissen, dann funktioniert hier also nur p+v und nicht v+p, wenn ich dich richtig verstanden habe.</p>
</blockquote>
<p>Jup. (Das Jup gilt natürlich nur, wenn ich dich richtig verstanden habe ;))</p>
<blockquote>
<blockquote>
<p>b) und c) sollten klar sein... D.h. wenn a) zutrift, ist b) überflüssig (sofern keine eventuellen Konvertierungen des linken Arguments stattfinden sollen).</p>
</blockquote>
<p>Den Anfang habe ich verstanden, allerdings mache ich mir um den Ausdruck in der Klammer (deiner Klammer) sorgen. Ist es da irgendwie möglich Objekte automatisch zu casten?</p>
</blockquote>
<p>Wie du ja sicherlich weißt, gibt es zwei Arten operator-Funktionen zu definieren. 1. als Methode einer Klasse, 2. als eigenständige (globale) Funktion.<br />
Wenn du eine Operator-Funktion als Methode einer Klasse definierst, besitzt ein n-ärer Operator n - 1 Argumente. (D.h. ein binärer Operator, der als Methode definiert wird, besitzt nur <em>einen</em> Parameter, ein unärer Operator keinen, usw.).<br />
Warum aber ist das so? Nun wenn du einen Operator als Methode definierst, ist der am weitesten links stehende Operand dein Objekt selbst (Also this). (Deshalb auch bei einem binär als Methode definierten Operator nur ein Paramter).<br />
Eine Konsequenz daraus, dass der am weitesten links stehende Operand dein Objekt selbst darstellt, ist, dass dieser Operand <em>immer</em> ein Objekt deiner Klasse ist (Logisch, oder ;)).<br />
Was ich mit meinem Satz in den Klammern andeuten wollte ist, dass b) nur überflüssig ist, wenn du den op+ immer mit einem Point3D als linkes Argument aufrufen willst.</p>
<p>Dazu ein Beispiel:</p>
<pre><code class="language-cpp">class String
{
   char* data;

   public:
     String(const char* d) 
     { 
        data = new char[strlen(d) + 1];
        strcpy(data, d);
     }
     ~String() { delete[] data; }

     // ...
     String operator+(const String&amp; rhs)
     {
        // *this + rhs irgendwie verketten
        // und ein temporäres Objekt dieser Verkettung zurückgeben.
     }
};
</code></pre>
<p>Wenn du jetzt zwei Objekte vom Typ String hast, kannst du den op+ wie folgt aufrufen:</p>
<pre><code class="language-cpp">String s1(&quot;Hallo&quot;), s2(&quot; Welt!&quot;);
String s3 = s1 + s2;
</code></pre>
<p>Außerdem kannst du den op+ so aufrufen:</p>
<pre><code class="language-cpp">// Das String-Literal &quot; Welt!&quot; wird über den Ctor von String in ein
// temporäres Objekt vom Typ String konvertiert. Danach werden s1 und
// das temporäre Objekt verkettet.
String s3 = s1 + &quot; Welt!&quot;;
</code></pre>
<p>aber nicht so:</p>
<pre><code class="language-cpp">// *this kann nicht konvertiert werden, wenn der op+ als Methode deklariert ist.
String s3 = &quot;Hallo&quot; + s2;
</code></pre>
<p>Wie du siehst, kann das ein Nachteil sein, wenn man Operatoren als Methoden definiert.<br />
Das Problem entfällt - wie du dir jetzt sicherlich erschließen kannst - bei einer globalen op+ Funktion.</p>
<blockquote>
<blockquote>
<p>Und jetzt noch eine Frage: Warum übergibst du die Argumente per value?</p>
</blockquote>
<p>Vermutlich weil ich doch noch keine Ahnung von C/C++ habe. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
In Java ist ja bekanntlich jedes Objekt immer Call by Reference...<br />
Wäre es so besser?</p>
<pre><code class="language-cpp">friend Point3D&lt;T&gt;&amp; operator+  &lt;&gt;(Point3D&lt;T&gt;&amp; a, Vector3D&lt;T&gt;&amp; b);
</code></pre>
</blockquote>
<p>Jetzt noch die Parameter als const deklarieren und ich bin zufrieden :).</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899648</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sun, 23 Oct 2005 21:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to Überladene Operatoren... on Mon, 24 Oct 2005 05:18:14 GMT]]></title><description><![CDATA[<p>Ich danke dir!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Warum kann das nicht einfach mal genau so in den Büchern stehen? Hat mir echt geholfen, ich glaub ich verstehe es jetzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/899702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899702</guid><dc:creator><![CDATA[Tobain]]></dc:creator><pubDate>Mon, 24 Oct 2005 05:18:14 GMT</pubDate></item></channel></rss>