<?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 + überschreiben]]></title><description><![CDATA[<pre><code class="language-cpp">class Vector
{
public:
	Vector(){}
	Vector(int n) : sum(0){
	    size = n;
	    array = new double[size];
	    initArray();
	}

	int getSize() const{return size;}

	double&amp; operator[](int index){
	    return array[index];
	}

         double&amp; operator[](int index) const{
	    return array[index];
	}

	const double operator * ( const Vector&amp; a){	
	    for(int i = 0 ; i &lt; size; ++i){
                 sum += array[i] * a[i];
	    }
	    return sum;
	}

	const Vector operator + ( const Vector&amp; a) 
	{
             Vector temp(a.getSize());

             for(int i = 0 ; i &lt; size; ++i)
             {
	        temp[i] += a[i];
             }
	    return temp;//hier machts problem
	}

	Vector&amp; operator =  (const Vector&amp; a)
	{
	    for(int i = 0 ; i &lt; size; ++i)
	    {
		array[i] = a[i];

	    }
	    return *this;
	}

	friend	ostream&amp; operator &lt;&lt; (ostream&amp; os , const Vector&amp; a)
	{
		for(int i = 0 ; i &lt; a.getSize(); ++i)
		{
			os &lt;&lt; a[i] &lt;&lt; endl;
		}
		return os;
	}

	~Vector(){delete [] array;}

private:
	void initArray()
	{
		for(int i = 0 ; i &lt; size; ++i)
		{
			array[i] = 0;
		}
	}

private:
	double* comp;
	int size;
	double* array;
	double sum;
};
</code></pre>
<p>Applikation:</p>
<pre><code class="language-cpp">void main()
{
	int usize = 0;
	cout &lt;&lt;&quot;enter size for u = &quot;; cin&gt;&gt;usize;

	Vector u(usize),v(10),w(10); 

	v[1] = 0.2;
	w[1] = 3;

	double x = v*w;
	cout &lt;&lt; x &lt;&lt; endl;
         cout&lt;&lt;&quot;what is the return: &quot;&lt;&lt;endl;
         u = v+w; //u = ?????????????????????
	cout &lt;&lt; u;
}
</code></pre>
<p>in der Methode operator + ein lokal erzeugtes Objekt wird zurückgegeben(als kopie),aber wenn man operator = aufruft (u = v+w),das parameter hat seinen Wert nicht mehr, wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175625/operator-überschreiben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 04:05:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175625.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Mar 2007 16:02:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:02:46 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Vector
{
public:
	Vector(){}
	Vector(int n) : sum(0){
	    size = n;
	    array = new double[size];
	    initArray();
	}

	int getSize() const{return size;}

	double&amp; operator[](int index){
	    return array[index];
	}

         double&amp; operator[](int index) const{
	    return array[index];
	}

	const double operator * ( const Vector&amp; a){	
	    for(int i = 0 ; i &lt; size; ++i){
                 sum += array[i] * a[i];
	    }
	    return sum;
	}

	const Vector operator + ( const Vector&amp; a) 
	{
             Vector temp(a.getSize());

             for(int i = 0 ; i &lt; size; ++i)
             {
	        temp[i] += a[i];
             }
	    return temp;//hier machts problem
	}

	Vector&amp; operator =  (const Vector&amp; a)
	{
	    for(int i = 0 ; i &lt; size; ++i)
	    {
		array[i] = a[i];

	    }
	    return *this;
	}

	friend	ostream&amp; operator &lt;&lt; (ostream&amp; os , const Vector&amp; a)
	{
		for(int i = 0 ; i &lt; a.getSize(); ++i)
		{
			os &lt;&lt; a[i] &lt;&lt; endl;
		}
		return os;
	}

	~Vector(){delete [] array;}

private:
	void initArray()
	{
		for(int i = 0 ; i &lt; size; ++i)
		{
			array[i] = 0;
		}
	}

private:
	double* comp;
	int size;
	double* array;
	double sum;
};
</code></pre>
<p>Applikation:</p>
<pre><code class="language-cpp">void main()
{
	int usize = 0;
	cout &lt;&lt;&quot;enter size for u = &quot;; cin&gt;&gt;usize;

	Vector u(usize),v(10),w(10); 

	v[1] = 0.2;
	w[1] = 3;

	double x = v*w;
	cout &lt;&lt; x &lt;&lt; endl;
         cout&lt;&lt;&quot;what is the return: &quot;&lt;&lt;endl;
         u = v+w; //u = ?????????????????????
	cout &lt;&lt; u;
}
</code></pre>
<p>in der Methode operator + ein lokal erzeugtes Objekt wird zurückgegeben(als kopie),aber wenn man operator = aufruft (u = v+w),das parameter hat seinen Wert nicht mehr, wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244127</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:02:46 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:10:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for(int i = 0 ; i &lt; size; ++i)
{
    temp[i] = array[i] + a[i];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1244133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244133</guid><dc:creator><![CDATA[lsg]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:11:53 GMT]]></title><description><![CDATA[<p>bau noch nen copy-ctor <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/1244135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244135</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:19:34 GMT]]></title><description><![CDATA[<p>lsg schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for(int i = 0 ; i &lt; size; ++i)
{
    temp[i] = array[i] + a[i];
}
</code></pre>
</blockquote>
<p>ergebnis ist das selbe, es geht nicht um den korrekten wert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244142</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:19:34 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:22:31 GMT]]></title><description><![CDATA[<p>rapso schrieb:</p>
<blockquote>
<p>bau noch nen copy-ctor <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>
</blockquote>
<p>wie soll der aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244146</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:22:31 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:34:09 GMT]]></title><description><![CDATA[<p>Du könntest sowas verwenden. Ich habe den operator= gleich mit korrigiert.</p>
<pre><code class="language-cpp">Vector(const Vector&amp; src) : array(new double[src.size]), size(src.size)
{
   std::copy(src.array, src.array+size, array);
}

void Swap(Vector&amp; src)
{
   std::swap(array, src.array);
   std::swap(size, src.size);
}

Vector&amp; operator =  (const Vector&amp; a)
{
    Vector tmp(a);
    Swap(tmp);
    return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1244157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244157</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:34:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 16:39:06 GMT]]></title><description><![CDATA[<p>Stimmt, für eine Kopie wird natürlich ein Kopier-Konstruktor benötigt, hatte ich auch übersehen <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 />
Man kann übrigens den operator auch im Konstruktor verwenden:</p>
<pre><code class="language-cpp">//copy-ctor
Vector(const Vector &amp;original)
{
    //Werte kopieren
    operator=(original);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1244159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244159</guid><dc:creator><![CDATA[lsg]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 17:59:05 GMT]]></title><description><![CDATA[<p>noch mehr sexy ist, wenn dein operator+ statt einem vector z.b. vectoradd zurueckgibt. dann brauchst du noch einen entsprechenden operator= und copy-ctor die beide vectoradd akzeptieren.<br />
beim kopieren setzt du im aktuellen objekt den ptr auf das array der quelle und in dem quell-objekt setzt du den zeiger auf auf null (darfst natuerlich das quellobjekt nicht per constreference sondern nur reference bekommen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244223</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Mon, 12 Mar 2007 17:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 19:34:56 GMT]]></title><description><![CDATA[<p>lsg schrieb:</p>
<blockquote>
<p>Stimmt, für eine Kopie wird natürlich ein Kopier-Konstruktor benötigt, hatte ich auch übersehen <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 />
Man kann übrigens den operator auch im Konstruktor verwenden:</p>
<pre><code class="language-cpp">//copy-ctor
Vector(const Vector &amp;original)
{
    //Werte kopieren
    operator=(original);
}
</code></pre>
</blockquote>
<p>Wieder einer, der meinte, sehr schlau zu sein. Führt erstens in diesem Falle zu Endlosrekursion, zweitens ist das Objekt beim Aufruf noch nicht zerstörbar, drittens ist es sowieso unlogisch, das so zu machen. Wieso will eigentlich jeder das Einfache (Copy-Ctor) durch das Komplizierte (Copy-Zuweisung) implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244265</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 Mar 2007 19:34:56 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 19:44:08 GMT]]></title><description><![CDATA[<p>die lösung war auf die ursprüngliche, einfache implementierung des operator= bezogen. umgekehrt, wenn der operator= den kopierkonstruktor benutzt, wird es nämlich komplizierter, da man sowas wie swap benutzen muss.</p>
<p>welches problem könnte verursacht werden, wenn das objekt beim aufruf noch nicht zerstörbar ist? hat das etwas mit exceptions zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244274</guid><dc:creator><![CDATA[lsg]]></dc:creator><pubDate>Mon, 12 Mar 2007 19:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 19:58:23 GMT]]></title><description><![CDATA[<p>lsg schrieb:</p>
<blockquote>
<p>umgekehrt, wenn der operator= den kopierkonstruktor benutzt, wird es nämlich komplizierter, da man sowas wie swap benutzen muss.</p>
</blockquote>
<p>Wenn man beide komplett ausprogrammiert, ist der op= immer der kompliziertere, weil er ein vorinitialisiertes Objekt erst &quot;leeren&quot; muss. Und wenn man auch noch auf die Idee kommt, so etwas wie du da zu fabrizieren, dann müsste der op= auch noch mit einem uninitialisierten *this zurechtkommen. Und auf Selbstzuweisung muss man auch noch prüfen.</p>
<p>Der Copy-Ctor ist da viel einfacher zu implementieren. Da ist immer klar, in welchem Zustand sich das Zielobjekt befindet.</p>
<p>Die &quot;Copy&amp;Swap&quot;-Implementierung des op= ist eine schöne, einfache, immer funktionierende, exception-sichere. Man muss nur einen ordentlichen Copy-Ctor schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244287</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 12 Mar 2007 19:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 20:01:19 GMT]]></title><description><![CDATA[<p>ok. danke für die lehre. <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/1244293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244293</guid><dc:creator><![CDATA[lsg]]></dc:creator><pubDate>Mon, 12 Mar 2007 20:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 20:43:37 GMT]]></title><description><![CDATA[<p>lsg schrieb:</p>
<blockquote>
<p>die lösung war auf die ursprüngliche, einfache implementierung des operator= bezogen. umgekehrt, wenn der operator= den kopierkonstruktor benutzt, wird es nämlich komplizierter, da man sowas wie swap benutzen muss.</p>
<p>welches problem könnte verursacht werden, wenn das objekt beim aufruf noch nicht zerstörbar ist? hat das etwas mit exceptions zu tun?</p>
</blockquote>
<p>Dein ursprüngliche, &quot;einfache&quot; Implementierung ist sowieso vollkommen defekt. Zum Einen kommt sie mit verschiedenen size Größen zurecht. Zum Anderen sind beim Aufruf aus dem CopyCtor heraus weder array noch size initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244340</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 Mar 2007 20:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Mon, 12 Mar 2007 22:34:31 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Du könntest sowas verwenden. Ich habe den operator= gleich mit korrigiert.</p>
<pre><code class="language-cpp">Vector(const Vector&amp; src) : array(new double[src.size]), size(src.size)
{
   std::copy(src.array, src.array+size, array);
}
    
void Swap(Vector&amp; src)
{
   std::swap(array, src.array);
   std::swap(size, src.size);
}
    
Vector&amp; operator =  (const Vector&amp; a)
{
    Vector tmp(a);
    Swap(tmp);
    return *this;
}
</code></pre>
</blockquote>
<p>hier statt Swap kann man es eigentlich auch kopieren, schliesslich es geht um ein temp var, richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244406</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Mon, 12 Mar 2007 22:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Tue, 13 Mar 2007 05:39:25 GMT]]></title><description><![CDATA[<p>netrobot schrieb:</p>
<blockquote>
<p>hier statt Swap kann man es eigentlich auch kopieren, schliesslich es geht um ein temp var, richtig?</p>
</blockquote>
<p>Falls du damit meinst, ob man die Vertauschung durch einfache Zuweisungen ersetzen kann: Nein. Es ist wichtig, dass der &quot;alte&quot; Inhalt des Objekts in der lokalen Variablen landet, damit dieser am Ende des Zuweisungsoperators ordentlich entsorgt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244431</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 13 Mar 2007 05:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Tue, 13 Mar 2007 08:21:36 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Dein ursprüngliche, &quot;einfache&quot; Implementierung ist sowieso vollkommen defekt.</p>
</blockquote>
<p>Es war zwar nicht meine, aber ich sehe es ein.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Zum Einen kommt sie mit verschiedenen size Größen zurecht.</p>
</blockquote>
<p>Kommt sie doch gar nicht <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>camper schrieb:</p>
<blockquote>
<p>Zum Anderen sind beim Aufruf aus dem CopyCtor heraus weder array noch size initialisiert.</p>
</blockquote>
<p>Ja stimmt; das habe ich jetzt verstanden. Außerdem müssen beim Zuweisungsoperator Dinge beachtet werden, die beim Kopierkonstruktor keine Rolle spielen.</p>
<p>netrobot schrieb:</p>
<blockquote>
<p>hier statt Swap kann man es eigentlich auch kopieren, schliesslich es geht um ein temp var, richtig?</p>
</blockquote>
<p>Kopieren tut hier der Kopierkonstruktor, aber nur in eine temp var. Swap vertauscht dann den Inhalt mit dem des aktuellen Objekts (ohne alle Werte einzeln vertauschen zu müssen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244487</guid><dc:creator><![CDATA[lsg]]></dc:creator><pubDate>Tue, 13 Mar 2007 08:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Tue, 13 Mar 2007 09:10:49 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>netrobot schrieb:</p>
<blockquote>
<p>hier statt Swap kann man es eigentlich auch kopieren, schliesslich es geht um ein temp var, richtig?</p>
</blockquote>
<p>Falls du damit meinst, ob man die Vertauschung durch einfache Zuweisungen ersetzen kann: Nein. Es ist wichtig, dass der &quot;alte&quot; Inhalt des Objekts in der lokalen Variablen landet, damit dieser am Ende des Zuweisungsoperators ordentlich entsorgt wird.</p>
</blockquote>
<p>hier tmp ist lokal erzeugt, dann der Inhalt wird mit aktuellem object umgetauscht, tmp ist nachher erstört worden, dann wieso muss man die beiden swappen, tmp ist sowieso nicht mehr da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244526</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Tue, 13 Mar 2007 09:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to operator + überschreiben on Tue, 13 Mar 2007 09:18:45 GMT]]></title><description><![CDATA[<p>Wenn du array zuweist, überschreibst du den alten Pointer und hast somit keine Möglichkeit mehr diesen Speicherbereich freizugeben. Beim Swap steckt genau dieser alte Speicherbereich dann in der temp-Variable und wird von dessen Destruktor am Ende des CopyCTors entsorgt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244531</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 13 Mar 2007 09:18:45 GMT</pubDate></item></channel></rss>