<?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 mal eine Frage zu folgender Operator Überladung. Überladen wird der Operator +=</p>
<pre><code class="language-cpp">String operator+=( const String&amp; str1 ) {
    String tmp(*this);
    delete [] buffer;
    ...
    buffer=new char[len]+1;
    ...
    return buffer;
}
</code></pre>
<pre><code class="language-cpp">String tmp(*this);
</code></pre>
<p>wieso wird hier das this objekt in tmp gebuffert? Was für einen Vorteil hat das?</p>
<pre><code>delete [] buffer;
</code></pre>
<p>wieso wird hier der SPeicher am Anfang der Methode freigegeben, da ist ja eig noch gar keiner reserviert, oder?</p>
<pre><code class="language-cpp">buffer=new char[len]+1;
</code></pre>
<p>Schreibfehler, oder wieso ist das +1 nicht in der Klammer?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257362/operator-überladung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 06:25:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257362.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Dec 2009 13:52:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator Überladung on Sun, 27 Dec 2009 13:52:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal eine Frage zu folgender Operator Überladung. Überladen wird der Operator +=</p>
<pre><code class="language-cpp">String operator+=( const String&amp; str1 ) {
    String tmp(*this);
    delete [] buffer;
    ...
    buffer=new char[len]+1;
    ...
    return buffer;
}
</code></pre>
<pre><code class="language-cpp">String tmp(*this);
</code></pre>
<p>wieso wird hier das this objekt in tmp gebuffert? Was für einen Vorteil hat das?</p>
<pre><code>delete [] buffer;
</code></pre>
<p>wieso wird hier der SPeicher am Anfang der Methode freigegeben, da ist ja eig noch gar keiner reserviert, oder?</p>
<pre><code class="language-cpp">buffer=new char[len]+1;
</code></pre>
<p>Schreibfehler, oder wieso ist das +1 nicht in der Klammer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828451</guid><dc:creator><![CDATA[Johnny++]]></dc:creator><pubDate>Sun, 27 Dec 2009 13:52:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Sun, 27 Dec 2009 13:59:11 GMT]]></title><description><![CDATA[<p>Johnny++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">buffer=new char[len]+1;
</code></pre>
<p>Schreibfehler, oder wieso ist das +1 nicht in der Klammer?</p>
</blockquote>
<p>Ziemlich sicher Schreibfehler, unter Umständen ein verheerender, da später möglicherweise <code>delete[]</code> auf den falschen Zeiger (Offset 1) angewandt wird.</p>
<p>Zu den anderen Dingen wäre es noch gut, die ganze Funktion (also auch die ...) zu sehen. Obwohl mir die Implementierung schon jetzt sehr merkwürdig vorkommt, arithmetische Zuweisungsoperatoren sollten eigentlich keine manuelle Speicherverwaltung übernehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828459</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 27 Dec 2009 13:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Sun, 27 Dec 2009 14:05:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">String operator+=( const String&amp; str1 ) {
    String tmp(*this);
    delete [] buffer;
    len=tmp.len+str.1.len;
    buffer=new char[len]+1;
    strcpy( buffer, tmp.buffer);
    strcat( buffer, str1.buffer);
    return buffer;
}
</code></pre>
<p>und hier die Klasse:</p>
<p>Das ganze soll die Operatorüberladung anhand einer &quot;String Klasse&quot; demonstrieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828465</guid><dc:creator><![CDATA[Johnny++]]></dc:creator><pubDate>Sun, 27 Dec 2009 14:05:37 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Sun, 27 Dec 2009 15:58:32 GMT]]></title><description><![CDATA[<p>da geht aber ziemlich viel nicht...</p>
<p>Johnny++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">String operator+=( const String&amp; str1 ) //#1
 {
    String tmp(*this);
    delete [] buffer;
    len=tmp.len+str.1.len; //#2
    buffer=new char[len]+1; //#3
    strcpy( buffer, tmp.buffer);
    strcat( buffer, str1.buffer);
    return buffer; //#4
}
</code></pre>
</blockquote>
<p>op+= gibt ne referenz zurück -&gt; <code>return *this;</code><br />
#2 wird syntax-mäßig voll in die hose gehen<br />
#3 hat nexus bereits erläutert</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828532</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 27 Dec 2009 15:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Sun, 27 Dec 2009 22:52:27 GMT]]></title><description><![CDATA[<p>Also 2 war ein Tipfehler von mir</p>
<p>und Rückgabeobjekt ist doch von der Klasse String, oder?</p>
<p>Hier nochmal die Klasse:</p>
<pre><code class="language-cpp">class String {
private:
char *buffer;
unsigned int len;

public:
String( const char* s= &quot;&quot;) {
len= strlen(s);
buffer= new char [len+1];
strcpy( buffer, s );
}
~String() {delete [] buffer;}

String operator+=( const String&amp; str1 ) {
    String tmp(*this);
    delete [] buffer;
    len=tmp.len+str1.len;
    buffer=new char[len]+1;
    strcpy( buffer, tmp.buffer);
    strcat( buffer, str1.buffer);
    return buffer;
}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1828711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828711</guid><dc:creator><![CDATA[Johnny++]]></dc:creator><pubDate>Sun, 27 Dec 2009 22:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Sun, 27 Dec 2009 23:34:42 GMT]]></title><description><![CDATA[<blockquote>
<p>und Rückgabeobjekt ist doch von der Klasse String, oder?</p>
</blockquote>
<p>Nein. Der Rückgabetyp sollte String&amp; sein. Du veränderst da ja dein aktuelles Objekt, also solltest du dann auch eine Referenz auf das aktuelle Objekt zurückgeben.</p>
<pre><code class="language-cpp">String s = &quot;hallo &quot;;
(s += &quot;Johnny++ &quot;) += &quot;wie geht es dir?&quot;;
std::cout &lt;&lt; s; // gäbe nur &quot;hallo Jonny++&quot; aus.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1828723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828723</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 27 Dec 2009 23:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 28 Dec 2009 01:21:19 GMT]]></title><description><![CDATA[<p>von der Sache her geht das so in etwa:</p>
<pre><code class="language-cpp">class String
{
public:
  String()
  : content_(0), length_(0)
  {}

  String(const char* content)
  : content_(0), length_(std::strlen(content))
  {
    content_ = new char[length_+1];
    std::copy(content, content+length_, content_);
  }

  String(const String&amp; other)
  : content_(0), length(other.GetSize())
  {
    content_ = new char[length_+1];
    std::copy(other.content, other.content+length_, content_);
  }

  unsigned int GetSize() const
  {
    return length_;
  }

  String&amp; operator+= (const String&amp; other)
  {
    if(other.GetSize() != 0)
    {
      String tmp(*this);
      delete []content_;
      length_ += other.GetSize();
      content_ = new char[length_+1];
      std::copy(tmp.content, tmp.content+tmp.GetSize(), content_);
      std::copy(other.content, other.content+other.GetSize(), content_+tmp.GetSize()+1);
    }
    return *this;
  }

private:
  char* content_;
  unsigned int length_;
};
</code></pre>
<p>Ist aber alles nicht zu empfehlen (Quellcode-Duplizierung, nicht Exception-sicher, ...).<br />
Falls du also nur eine zuverlässige string-Klasse suchst, dann würde ich dir std::string empfehlen...</p>
<p>bb</p>
<p>PS: das length+1 brauchst du eigtl nirgendwo - also zumindest das +1.<br />
du setzt eh nirgendwo ne '\0' als ende-kennzeichen - brauchst du ja auch nicht. ich habs aber mal so beibehalten - falls du das irgendwo nutzt, hast du bisher aber vergessen, ihm nen wert zuzuweisen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828738</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 28 Dec 2009 01:21:19 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 28 Dec 2009 09:34:13 GMT]]></title><description><![CDATA[<p>Also das Beispiel ist aus dem Buch C++ von A bis Z. Und zwar das erste zum Thema Operator Überladung. Da steht auch da, das das nicht gut gelöst ist, und man lieber die std string klasse nehmen soll. Außerdem, das nur das geht:</p>
<p>string1+=&quot;....&quot;;<br />
string1+=&quot;....&quot;;</p>
<p>Aber wieso braucht es eine Referenz, damit ich das auch hintereinander schreiben kann?</p>
<p>Und was ist mit meinen Fragen vom Anfang:</p>
<p>wieso wird hier das this objekt in tmp gebuffert? Was für einen Vorteil hat das?<br />
Code:</p>
<p>wieso wird hier der SPeicher am Anfang der Methode freigegeben, da ist ja eig noch gar keiner reserviert, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1828773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1828773</guid><dc:creator><![CDATA[Johnny++]]></dc:creator><pubDate>Mon, 28 Dec 2009 09:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Mon, 28 Dec 2009 19:38:37 GMT]]></title><description><![CDATA[<p>Johnny++ schrieb:</p>
<blockquote>
<p>string1+=&quot;....&quot;;<br />
string1+=&quot;....&quot;;</p>
</blockquote>
<p>Wenn nur das gehen sollte, dann brauchst du auch gar keinen Rückgabetyp.<br />
Aber man lehnt sich bei den Operatoren immer an den Operatoren für die build-in-datentypen an, und da geht eben auch sowas:</p>
<pre><code class="language-cpp">int a = 3;
int b = 4;

int c = a+= b+= 1;
//b == 4+=1 == 5
//a == 3+=b == 8
//c == a == 8
</code></pre>
<p>Wenn man dort eine Kopie zurückgeben würde, würde man andere Werte herausbekommen...</p>
<blockquote>
<p>wieso wird hier das this objekt in tmp gebuffert? Was für einen Vorteil hat das?</p>
</blockquote>
<p>es hat den vorteil, dass es so geht^^<br />
man hat ja nur 2 objekte und muss eins davon verändern - braucht dafür allerdings die daten von beiden objekten wieder.<br />
das man den speicher zuvor löchen muss, um mehr speicher zu reservieren, sollte klar sein.</p>
<blockquote>
<p>wieso wird hier der SPeicher am Anfang der Methode freigegeben, da ist ja eig noch gar keiner reserviert, oder?</p>
</blockquote>
<p>doch - da ist speicher reserviert, weil zuvor ein konstruktor aufgerufen wird - wenn das nur der standard konstruktor ist(wo wirklich kein <code>new[]</code> zu finden ist, ist das deshalb nicht weiter schlimm, weil <code>delete[] 0;</code> wohl definiert ist)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829013</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 28 Dec 2009 19:38:37 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 29 Dec 2009 20:10:28 GMT]]></title><description><![CDATA[<p>nochmal eine Frage zu dem return Wert. So für die Anwendung wie in dem Buch hätte man die Methode doch auch void machen können, oder? Weil eig wird ja das Objekt direkt verändert. Was bringt der dann überhaupt? Aber ist der Rückabetyp laut Definition nicht eig. ein String Objekt?</p>
<p>Weil es geht ja:<br />
[cpp]<strong>String</strong> operator+=(...[/cpp]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829517</guid><dc:creator><![CDATA[Jonny++]]></dc:creator><pubDate>Tue, 29 Dec 2009 20:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 29 Dec 2009 20:57:35 GMT]]></title><description><![CDATA[<p>Der Rückgabewert des += Operators ist eigentlich normalerweise eine Referenz auf das Objekt selber. Siehe auch hier:</p>
<p><a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">http://magazin.c-plusplus.net/artikel/�berladung von Operatoren in CPlusPlus (Teil 1)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829542</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 29 Dec 2009 20:57:35 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 29 Dec 2009 21:22:25 GMT]]></title><description><![CDATA[<p>Ja das wurde ja schon gesagt. Ich würde nur gerne mal wissen, wie das in dem Beispiel im Buch ist. Weil als Rückgabetyp wird ja eig ein Objekt vom Typ String festgelegt, aber nur eine Eigenschaft von diesem zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829551</guid><dc:creator><![CDATA[Jonny++]]></dc:creator><pubDate>Tue, 29 Dec 2009 21:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 29 Dec 2009 21:35:15 GMT]]></title><description><![CDATA[<p>das hab ich doch schon in meinem post geschrieben!?</p>
<blockquote>
<p>Wenn nur das gehen sollte, dann brauchst du auch gar keinen Rückgabetyp.<br />
Aber man lehnt sich bei den Operatoren immer an den Operatoren für die build-in-datentypen an</p>
</blockquote>
<p>soll heißen: der rückgabetyp ist in dem fall völlig irrelevant, weil das zurückgegebene Objekt nirgendwo verwendet wird...<br />
Aber jz lies doch endlich mal den Artikel und frag erst danach weiter immerzu das gleiche...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829553</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 29 Dec 2009 21:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 29 Dec 2009 21:51:23 GMT]]></title><description><![CDATA[<p>gut ich werde mir den artikel durchlesen. mich hat eben nur verwirrt, dass als Rückgabetyp String angegeben wird, aber da steht return buffer, was ja nur ein Element von String ist. Da weis ich nicht, ob das so geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829559</guid><dc:creator><![CDATA[Jonny++nochmal eine Frage]]></dc:creator><pubDate>Tue, 29 Dec 2009 21:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung on Tue, 29 Dec 2009 22:01:22 GMT]]></title><description><![CDATA[<p>Jonny++nochmal eine Frage schrieb:</p>
<blockquote>
<p>gut ich werde mir den artikel durchlesen. mich hat eben nur verwirrt, dass als Rückgabetyp String angegeben wird, aber da steht return buffer, was ja nur ein Element von String ist. Da weis ich nicht, ob das so geht.</p>
</blockquote>
<p>das geht, weil es einen (nicht als explicit deklarierten) ctor gibt, der ein const char* als einziges argument akzeptiert...<br />
ist das gleiche wie:</p>
<pre><code class="language-cpp">class foo
{
public:
  foo(int unsued) {}
};

foo get_foo()
{
  return 5;
}
</code></pre>
<p>weil man das manchmal nicht möchte, gibt es das schlüsselwort explicit - das ist aber wieder eine andere baustelle ;o)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1829567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1829567</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 29 Dec 2009 22:01:22 GMT</pubDate></item></channel></rss>