<?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>hallo...<br />
ich suche eine liste oder ähnliches, wo drin steht, welchen rückgabetyp der standard bei den verschiedenen operatoren vorschreibt/empfiehlt...</p>
<p>also ob = nix zurückgibt (also void) oder doch nen bool zurückgeben sollte etc...</p>
<p>Danke schon mal : )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217214/operatoren-überladen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 17:40:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217214.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Jul 2008 15:04:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 15:04:31 GMT]]></title><description><![CDATA[<p>hallo...<br />
ich suche eine liste oder ähnliches, wo drin steht, welchen rückgabetyp der standard bei den verschiedenen operatoren vorschreibt/empfiehlt...</p>
<p>also ob = nix zurückgibt (also void) oder doch nen bool zurückgeben sollte etc...</p>
<p>Danke schon mal : )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541089</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 04 Jul 2008 15:04:31 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 15:21:08 GMT]]></title><description><![CDATA[<p>Wenn du Operatoren für eigene Datentypen (Klassen) überladen willst, kommt es darauf an, wozu du sie benötigst. Hier ein paar Standardbeispiele:</p>
<p>Der <strong>Zugriffsoperator []</strong> (z.B. bei Containern) gibt normalerweise eine konstante Referenz zurück.</p>
<p>Bei <strong>arithmetischen</strong> (unären und binären) <strong>Operatoren</strong> (global; +, -, *, /, %; als Methode +=, -=, *=, /=, %=; unär als Vorzeichen +, -) gibst du meistens eine Kopie eines temporär erzeugten Objekts zurück. Je nach Anwendung kannst du das auch bei &amp;&amp; und || oder evtl. &amp;, |, ^, ~ tun.</p>
<p><strong>Vergleichsoperatoren</strong> (==, !=, &lt;, &lt;=, &gt;, <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f606.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_squinting_face"
      title="&gt;=)"
      alt="😆"
    /> geben normalerweise <code>bool</code> zurück, weil ja ein Wahrheitswert erwartet wird.</p>
<p>Bei <strong>Zuweisungen</strong> ist der Rückgabetyp eine Referenz auf das neue Element, damit auch Mehrfachzuweisungen ( <code>A = B = C;</code> )möglich sind:</p>
<pre><code class="language-cpp">class MyClass
{
private:
	int x;
public:
	MyClass&amp; operator = (const MyClass&amp; Origin);
};

MyClass&amp; MyClass::operator = (const MyClass&amp; Origin)
{
	x = Origin.x;
	return *this;  // Rückgabe: Referenz auf diese Instanz
}
</code></pre>
<p>Natürlich gibt es noch viel mehr Operatoren, aber ich denke, diese werden am meisten überladen, und bei einigen kenn ich mich auch nur schlecht aus <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 />
Ausserdem bist du da auch ziemlich frei, was die Überladungen betreffen. Der Rückgabetyp hängt eben davon ab, was du mit dem Operator erreichen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541096</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 04 Jul 2008 15:21:08 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 15:48:04 GMT]]></title><description><![CDATA[<p>Danke - aus deiner Antwort schließ ich jetzt einfach mal, dass du es auch immer so machst, wie du gerad denkst und wozu du lust hast bzw was du brauchst und im standard darüber keine angaben gemacht werden ^^</p>
<p>klasse anleitung btw <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>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541112</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 04 Jul 2008 15:48:04 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 16:00:28 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Danke - aus deiner Antwort schließ ich jetzt einfach mal, dass du es auch immer so machst, wie du gerad denkst und wozu du lust hast bzw was du brauchst und im standard darüber keine angaben gemacht werden ^^</p>
</blockquote>
<p>Naja, wenn du das nur bei eigenen kleinen Klassen machst, geht z.B. <code>void operator=</code> noch, aber ich würd das bei diesem Beispiel von Anfang an mit Referenzrückgabe machen. Was die anderen Operatoren betrifft, ist es wohl am besten, wenn du sie so überlädst, wie man es erwartet. Also z.B. <code>operator+</code> für die Addition und Rückgabe eines Objektes mit dem gleichen Typ wie die Operanden. Aber im Standard gibt es keine Vorgaben bezüglich Rückgabetyp, allerdings bezüglich Operandenzahl, Priorität und Assoziativität der Operatoren.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>klasse anleitung btw <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>
</blockquote>
<p>Vielen Dank <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/1541118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541118</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 04 Jul 2008 16:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 16:01:13 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Danke - aus deiner Antwort schließ ich jetzt einfach mal, dass du es auch immer so machst, wie du gerad denkst und wozu du lust hast bzw was du brauchst und im standard darüber keine angaben gemacht werden ^^</p>
<p>klasse anleitung btw <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>bb</p>
</blockquote>
<p>Natürlich gibts dafür best Practises. Aber Vorschriften gibt es keine. Lies einfach die Standard-C++ Bücher die sich mit sauberem C++ Design auseinandersetzen dann weißt du schon was man machen soll was nicht und warum und weshalb und dann kannst du dir bei den restlichen Fällen leicht überlegen was man tun sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541120</guid><dc:creator><![CDATA[OMFG!!!!!]]></dc:creator><pubDate>Fri, 04 Jul 2008 16:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 16:18:05 GMT]]></title><description><![CDATA[<p>Mal angenommen, ich habe einfach nichts darüber gefunden (weil ich zu doof zum googlen bin oder wie au immer)...</p>
<p>Und bevor ich meine Operatoren einfach weiter nach belieben überlade frag ich einfach mal...</p>
<p>Z.bsp. finde ich nicht, dass += eine Referenz wiedergeben sollte - denn wie oft benutzt man schon Konstrukte á la:</p>
<pre><code class="language-cpp">A = B += C;
</code></pre>
<p>Oder optimiert das der Kompiler auch raus?</p>
<pre><code class="language-cpp">struct bla
{
int var;
bla (int _var) : var (_var) {};
void operator = (const bla &amp;other) {var = other.bla;};
void operator += (const bla &amp;other) {var += other.bla;};
};

//...

bla A, B, C;
B = C; A = B;
B += C;
A = B;
</code></pre>
<pre><code class="language-cpp">struct bla2
{
int var;
bla (int _var) : var (_var) {};
const bla&amp; operator = (const bla &amp;other) {var = other.bla; return *this;};
const bla&amp; operator += (const bla &amp;other) {var += other.bla; return *this;};
};

//...

bla2 A, B, C;
A = B = C;
A = B += C;
</code></pre>
<p>ist das gleichschnell?</p>
<p>Und:</p>
<pre><code class="language-cpp">bla2 A (2), B (2), C (2);
bla D (2), E (2), F (2);

A += B;
D += E;
</code></pre>
<p>ist das auch gleichschnell?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541132</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 04 Jul 2008 16:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 17:01:14 GMT]]></title><description><![CDATA[<p>Ich hab mal ein kleines Benchmark mit deinem Code (nach Korrektur der Fehler :p) geschrieben ( <code>sf::Clock</code> ist dabei eine Zeitklasse meiner Grafikbibliothek, die die Zeit in Sekunden seit <code>Reset()</code> oder dem Konstruktoraufruf zählt):</p>
<pre><code class="language-cpp">struct bla 
{ 
int var; 
bla() {};
void operator = (const bla &amp;other) {var = other.var;}; 
void operator += (const bla &amp;other) {var += other.var;}; 
}; 

struct bla2 
{ 
int var; 
bla2() {};
const bla2&amp; operator = (const bla2 &amp;other) {var = other.var; return *this;}; 
const bla2&amp; operator += (const bla2 &amp;other) {var += other.var; return *this;}; 
}; 

int main()
{
	bla A, B, C; 
	bla2 D, E, F;

	long long int n = 100000000000;
	sf::Clock Clock;
	for (long long i = 0; i &lt; n; i++)
	{
		B = C; A = B; 
		B += C; 
		A = B; 
	}
	std::cout &lt;&lt; Clock.GetElapsedTime() &lt;&lt; std::endl;
	Clock.Reset();
	for (long long i = 0; i &lt; n; i++)
	{
		D = E = F; 
		D = E += F; 
	}
	std::cout &lt;&lt; Clock.GetElapsedTime() &lt;&lt; std::endl;
	std::cin.get();
}
</code></pre>
<p>Ausgabe bei 3 Programmaufrufen:</p>
<pre><code>105.299
108.389
</code></pre>
<pre><code>110.77
107.935
</code></pre>
<pre><code>109.273
107.194
</code></pre>
<p>Der Unterschied macht also nicht wirklich viel aus. Eine Referenz zurückzugeben ist ja auch nicht wahnsinnig zeitintensiv. Da gibt es meistens bessere Orte, um Optimierungen anzubringen. Und denke daran: Es sind 100 Milliarden Aufrufe oben <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 />
Ich selber wäre bereit, den kleinen Performanceverlust (ist es überhaupt einer?) für einen grösseren Anwendungsbereich in Kauf zu nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541157</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 04 Jul 2008 17:01:14 GMT</pubDate></item><item><title><![CDATA[Reply to operatoren überladen on Fri, 04 Jul 2008 17:06:22 GMT]]></title><description><![CDATA[<p>Ok, dann haste mich jz wo doch gerad so überzeugt ^^</p>
<p>Danke : &gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1541162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1541162</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 04 Jul 2008 17:06:22 GMT</pubDate></item></channel></rss>