<?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[Operator Überladung]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mir gerade die Frage gestellt, wo der Unterschied zwischen Kopierkonstruktor und Zuweisungsoperator besteht.<br />
Dann:</p>
<pre><code class="language-cpp">friend bool operator &lt; (const A&amp; Aobj1, const A&amp; Aobj2)
</code></pre>
<p>Wieso ist hier eine Überladung per globaler freiend Funktion nötig?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262604/operator-überladung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 07:42:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262604.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Mar 2010 19:30:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 19:30:45 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mir gerade die Frage gestellt, wo der Unterschied zwischen Kopierkonstruktor und Zuweisungsoperator besteht.<br />
Dann:</p>
<pre><code class="language-cpp">friend bool operator &lt; (const A&amp; Aobj1, const A&amp; Aobj2)
</code></pre>
<p>Wieso ist hier eine Überladung per globaler freiend Funktion nötig?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866147</guid><dc:creator><![CDATA[OOP Anäfnger]]></dc:creator><pubDate>Mon, 08 Mar 2010 19:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 19:39:45 GMT]]></title><description><![CDATA[<p>OOP Anäfnger schrieb:</p>
<blockquote>
<p>ich habe mir gerade die Frage gestellt, wo der Unterschied zwischen Kopierkonstruktor und Zuweisungsoperator besteht.</p>
</blockquote>
<p>Der Kopier<strong>konstruktor</strong> erzeugt ein neues Objekt, indem ein bereits existierendes kopiert wird. Der Zuweisungsoperator überschreibt ein bestehendes Objekt.</p>
<p>OOP Anäfnger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">friend bool operator &lt; (const A&amp; Aobj1, const A&amp; Aobj2)
</code></pre>
<p>Wieso ist hier eine Überladung per globaler freiend Funktion nötig?</p>
</blockquote>
<p>Wer sagt, dass diese nötig ist? Ohne Kontext kann man dazu nichts sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866153</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 19:39:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 19:46:16 GMT]]></title><description><![CDATA[<p>Das ist der Rest.</p>
<pre><code class="language-cpp">friend bool operator &lt; (const A&amp; Aobj1, const  A&amp; Aobj2){
   if(Aobj1.ival&lt;Aobj2.ival)
      return true;
   else return false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866156</guid><dc:creator><![CDATA[OOP Anäfnger]]></dc:creator><pubDate>Mon, 08 Mar 2010 19:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 19:49:56 GMT]]></title><description><![CDATA[<p>Wahrscheinlich willst du darauf hinaus, dass der <code>operator&lt;</code> auf private Membervariablen zugreift (hier <code>ival</code> ) und deswegen ein <code>friend</code> der Klasse sein muss. Allerdings ist das nicht nötig, wenn die Klasse <code>A</code> sauber gekapselt ist und Get-Methoden für <code>ival</code> anbietet. Ich rate dir zu diesem Schritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866160</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 19:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:07:49 GMT]]></title><description><![CDATA[<p>Aber wenn ich das als Klassenmethode definiere kann ich doch auf die Privaten Elemente zugreifen, oder etwa nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866176</guid><dc:creator><![CDATA[OOP Anäfnger]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:14:25 GMT]]></title><description><![CDATA[<p>Ja, aber der <code>operator&lt;</code> sollte besser global sein. Im <a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">Artikel über Operatorüberladung</a> steht auch wieso. Den würde ich unbedingt mal durchlesen, er enthält sehr viele Tipps und Best Practices.</p>
<p>Die Frage ist: Brauchst du überhaupt Zugriff auf private Membervariablen? Denn wenn ein Getter sowieso angebracht ist, warum nicht diesen nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866181</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:21:46 GMT]]></title><description><![CDATA[<p>Gut den Artikel werde ich mir durchlesen. Aber wieso get, wenn ich die Überladung als Klassenmethode mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866189</guid><dc:creator><![CDATA[OOP Anäfnger]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:23:52 GMT]]></title><description><![CDATA[<p>OOP Anäfnger schrieb:</p>
<blockquote>
<p>Aber wieso get, wenn ich die Überladung als Klassenmethode mache?</p>
</blockquote>
<p>Du machst die Operatorüberladung nicht als Klassenmethode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866192</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:23:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:31:50 GMT]]></title><description><![CDATA[<p>Macht man die Überladung nicht in den Public Bereich der Klasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866200</guid><dc:creator><![CDATA[OOP Anfänger]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:31:50 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:33:54 GMT]]></title><description><![CDATA[<p>OOP Anfänger schrieb:</p>
<blockquote>
<p>Macht man die Überladung nicht in den Public Bereich der Klasse?</p>
</blockquote>
<p>Nein, du machst sie global (hier für den Fall des <code>operator&lt;</code> , je nach Operator siehts ein wenig anders aus). Aber lies doch den Artikel, dort wird das alles erklärt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866201</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:34:12 GMT]]></title><description><![CDATA[<p>OOP Anfänger schrieb:</p>
<blockquote>
<p>Macht man die Überladung nicht in den Public Bereich der Klasse?</p>
</blockquote>
<p>Steht in dem Artikel.</p>
<p>Trägt unter anderem zur Symmetrie des Operators bei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866203</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:46:09 GMT]]></title><description><![CDATA[<p>Also gilt das nur bei den Vergleichsoperatoren, dass man diese als globale Funktion überladen sollte. Den Zuweisungsoperator zum Beispiel macht man ja trotzdem als Klassenmethode, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866220</guid><dc:creator><![CDATA[OOP Anfänger]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:46:09 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:48:52 GMT]]></title><description><![CDATA[<p>OOP Anfänger schrieb:</p>
<blockquote>
<p>Also gilt das nur bei den Vergleichsoperatoren, dass man diese als globale Funktion überladen sollte.</p>
</blockquote>
<p>Nein -&gt; Artikel lesen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866223</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 08 Mar 2010 20:56:25 GMT]]></title><description><![CDATA[<p>Ja und evlt noch bei anderen. Ich habe mir den Artikel noch nicht ganz durchgelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866231</guid><dc:creator><![CDATA[OOP Anfänger]]></dc:creator><pubDate>Mon, 08 Mar 2010 20:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 09 Mar 2010 09:46:48 GMT]]></title><description><![CDATA[<blockquote>
<p>Allerdings ist das nicht nötig, wenn die Klasse A sauber gekapselt ist und Get-Methoden für ival anbietet. Ich rate dir zu diesem Schritt.</p>
</blockquote>
<p>Ich rate nicht zu diesem Schritt, wenn durch die get/set-Methoden kein Mehrwert ausserhalb der Klasse erreicht wird. Mittels friend oeffne ich explizit fuer diese Funktion den private-Bereich. Mittels get/set oeffne ich fuer alle anderen den private-Bereich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866402</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 09 Mar 2010 09:46:48 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 09 Mar 2010 11:27:19 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Allerdings ist das nicht nötig, wenn die Klasse A sauber gekapselt ist und Get-Methoden für ival anbietet. Ich rate dir zu diesem Schritt.</p>
</blockquote>
<p>Ich rate nicht zu diesem Schritt, wenn durch die get/set-Methoden kein Mehrwert ausserhalb der Klasse erreicht wird. Mittels friend oeffne ich explizit fuer diese Funktion den private-Bereich. Mittels get/set oeffne ich fuer alle anderen den private-Bereich.</p>
</blockquote>
<p>Ähnliche Diskussion zu einem anderen Operator siehe auch <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1865140-and-highlight-is-.html#1865140" rel="nofollow">hier</a> - ich würde hier wie auch im op&lt;&lt; - Fall weder zur friend-deklaration noch zu allgemeingültigen Gettern raten, sondern eine Methode anbieten die die eigentliche Arbeit des op&lt; übernimmt:</p>
<pre><code class="language-cpp">class C : public boost::less_than_comparable&lt;C&gt;
{
  public:
  bool lessThan(C const&amp; other) const
  {
    /* Zugriff auf private Daten */
  }
};

inline bool operator &lt; (C const&amp; lhs, C const&amp; rhs)
{
  return lhs.lessThan(rhs);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866449</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 09 Mar 2010 11:27:19 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 09 Mar 2010 17:13:44 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ich rate nicht zu diesem Schritt, wenn durch die get/set-Methoden kein Mehrwert ausserhalb der Klasse erreicht wird.</p>
</blockquote>
<p>In vielen Fällen entsteht ein Mehrwert, weil eine öffentliche Eigenschaft verglichen wird, also sowieso entsprechende Get- und Set-Methoden notwendig sind. Aber der Einwand ist natürlich berechtigt.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>ich würde hier wie auch im op&lt;&lt; - Fall weder zur friend-deklaration noch zu allgemeingültigen Gettern raten, sondern eine Methode anbieten die die eigentliche Arbeit des op&lt; übernimmt:</p>
<pre><code class="language-cpp">class C : public boost::less_than_comparable&lt;C&gt;
{
  public:
  bool lessThan(C const&amp; other) const
  {
    /* Zugriff auf private Daten */
  }
};
</code></pre>
</blockquote>
<p>Nun ja, man kanns auch übertreiben. Wenn du dieses Konzept konsequent durchziehst, landest du bei Java-Konstrukten wie <code>a.equals(b)</code> oder <code>a.compareTo(b)</code> . Und zwar <em>zusätzlich</em> zu den freien Funktionen – das ist ja das Schlimme. In Java ist sind solche Methoden okay, weil es keine freien Funktionen oder Operatoren gibt. Aber in C++? Welchen Mehrwert bringt <code>lessThan()</code> ? Man muss mehr Code schreiben, hat eine asymmetrische Methode mit zusätzlicher Indirektion und bietet zwei Funktionen für den genau gleichen Zweck an. Rechtfertigt das Vermeiden von <code>friend</code> wirklich diese Nachteile?</p>
<p>Wie schon im verlinkten Thread angedeutet: Man kann mit dem Versuch, die Kapselung zu erhöhen, das genaue Gegenteil erreichen. Zumindest wenn man Kapselung nicht nur durch formale Aspekte wie &quot;ist Memberfunktion der Klasse&quot; definiert, sondern durch semantische (&quot;hat Zugriff auf private Member&quot;). Den Ansatz, Schnittstellen nicht unnötig aufzublähen, sehe ich nämlich als wichtigen Bestandteil dieses Konzepts an.</p>
<p>Nur, damit ich nicht missverstanden werde: Ich finde es durchaus gut, wenn eine Klasse weitgehend für sich selbst zuständig ist, und will <code>friend</code> keinesfalls verharmlosen. Es ist ein Sprachmittel, das mit Bedacht eingesetzt und wenn <em>sinnvoll</em> möglich vermieden werden soll. In vielen Fällen (z.B. <code>operator+=</code> und <code>operator+</code> ) geht das auch sehr elegant. Aber meiner Meinung nach ist eine kategorische Abneigung gegen Sprachmittel wie <code>friend</code> nicht unbedingt förderlich, wenn es ums Design einer Klassenschnittstelle geht. Denn erst durch die Kombination der verschiedenen Möglichkeiten kommt das volle Potenzial einer Programmiersprache zur Geltung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866634</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Mar 2010 17:13:44 GMT</pubDate></item></channel></rss>