<?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[Die this Zeiger]]></title><description><![CDATA[<p>Hallo,<br />
Ich bin C++ Anfänger und bin bei meinem Buch gerade zu den this Zeigern gekommen und verstehe den Nutzen dahinter nicht. Was macht this, this-&gt; und *this?</p>
<p>Danke für eure Antworten</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313304/die-this-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 07:49:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313304.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Jan 2013 08:45:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 08:46:50 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich bin C++ Anfänger und bin bei meinem Buch gerade zu den this Zeigern gekommen und verstehe den Nutzen dahinter nicht. Was macht this, this-&gt; und *this?</p>
<p>Danke für eure Antworten</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293812</guid><dc:creator><![CDATA[Maxtheprinz]]></dc:creator><pubDate>Sun, 27 Jan 2013 08:46:50 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:16:01 GMT]]></title><description><![CDATA[<p>Und was Klassen und Methoden sind, ist dir klar? Wenn dem so ist, was genau ist dir an this rätselhaft? Eine Methode wird immer für ein konkretes Objekt aufgerufen. this liefert dir einfach in der Methode einen Zeiger auf das in jeweils Bearbeitung befindliche Objekt.</p>
<p>Anders ausgedrückt: Du kannst dir eine Methode wie eine Funktion mit einem versteckten zusätzlichen Parameter vorstellen. Dieser versteckte Parameter ist ein zeiger auf das Objekt auf dem die Methode aufgerufen wird und heißt this:</p>
<pre><code class="language-cpp">class T
{
public:
  void method(int i, float x);
};

// kannst du dir also vorstellen wie

void T::method(T* this, int i, float x)
{
}

// und

T obj;

obj.method(42, 3.14f);

// kannst du dir vorstellen wie

method(&amp;obj, 42, 3.14f);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2293815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293815</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:16:01 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:14:47 GMT]]></title><description><![CDATA[<p>Mit this-&gt; greifst du explizit auf die Member der aktuellen Instanz zurück.<br />
Das ist nützlich wenn du bspw. einen Member value hast und der wird in setValue() gesetzt. Der Parameter für setValue() heißt ebenfalls value, dann kannst du schreiben:</p>
<pre><code>void setValue(int value)
{
    this-&gt;value = value;
}
</code></pre>
<p>Solche Situationen lassen sich aber i.d.R. vermeiden.<br />
*this liefert das Objekt als ganzes zurück. Um Operatoren verkettet aufrufen zu können (wie &lt;&lt; bei cout) muss das Ergebnis wieder ein ostream sein, auf den dann weider &lt;&lt; ausgeführt ist.<br />
Aus</p>
<pre><code>cout &lt;&lt; foo &lt;&lt; bar;
</code></pre>
<p>wird, nachdem foo geschrieben wurde:</p>
<pre><code>cout &lt;&lt; bar;
</code></pre>
<p>Weil die Operation wieder cout zurückgeliefert hat.<br />
*this kann man damit gut verwenden.</p>
<pre><code>foo foo::funktionDieAktuelleInstanzAlsRueckgabewertHat()
{
    // ...
    return *this;
}
</code></pre>
<p>Wenn this nicht dereferenziert wurde, kann man damit überprüfen ob eine Funktion, die eine Instanz der Klasse als Parameter hat, mit dem Objekt selber aufgerufen wurde, das will man z.B. beim Zuweisungsoperator verhindern.</p>
<pre><code>foo a;
a = a;
</code></pre>
<p>Deswegen testet man ob die Adresse des übergebenen Arguments die selbe ist, wie das eigene Objekt.</p>
<pre><code>foo foo::operator = (const foo &amp;other)
{
    if (this != &amp;other)
    {
        // hier die Member kopieren
    }
    return *this; // Zum Schluss wieder die aktuelle Instanz zurückgeben, für a = b = c
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2293816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293816</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:14:47 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:21:29 GMT]]></title><description><![CDATA[<p>Dankeschön euch beiden, war eigentlich nicht mal so schwer zu verstehen <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>
<p>Lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293818</guid><dc:creator><![CDATA[Maxtheprinz]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:23:02 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Wenn this nicht dereferenziert wurde, kann man damit überprüfen ob eine Funktion, die eine Instanz der Klasse als Parameter hat, mit dem Objekt selber aufgerufen wurde, das will man z.B. beim Zuweisungsoperator verhindern.</p>
<pre><code>foo a;
a = a;
</code></pre>
<p>Deswegen testet man ob die Adresse des übergebenen Arguments die selbe ist, wie das eigene Objekt.</p>
<pre><code>foo foo::operator = (const foo &amp;other)
{
    if (this != &amp;other)
    {
        // hier die Member kopieren
    }
    return *this; // Zum Schluss wieder die aktuelle Instanz zurückgeben, für a = b = c
}
</code></pre>
</blockquote>
<p>Dazu sei aber unbedingt erwähnt, dass man sowas in der Praxis niemals machen will, ganz besonders nicht bei kleinen Objekten mit Wertsemantik, also eben genau der Art von Typ, für die ein operator = in der Regel definiert wird. Denn mit so einer Konstruktion führt man zusätzlichen Overhead für den allgemeinen Fall ein, um einen Spezialfall zu optimieren, was selten eine gute Idee ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293819</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:25:08 GMT]]></title><description><![CDATA[<p>Es war ja nur ein Beispiel. Mir fiel nichts besseres ein. ^^<br />
Und solange man eh nur STL-Container benutzt, braucht man eigentlich nie eine Überladung von Destruktor und Copy/Move-Konstruktor/Zuweisung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293820</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:27:55 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a>: Ich finde deine Erklärung mit versteckten (this) Parameter nicht so hilfreich, weil das nur ein internes C++ Implementierungsdetail ist.</p>
<p>this zeigt, innerhalb einer Objektes, auf das Objekt auf dem eine Methode aufgerufen wird. Immer wenn man einen Pointer auf genau dieses Objekt innerhalb einer Methode braucht, dann benutzt man this. Nathan hat für die Verwendung schon Bsp. genannt.</p>
<p>Was macht this-&gt; bzw. *this?</p>
<p>Genau daselbe wie bei &quot;normalen&quot; Pointern! Du kannst dir das so überlegen:</p>
<pre><code>class A
{
public:
  void f()
  {
    A* zeigerAufDiesesObjekt = this;

    // zeigerAufDiesesObjekt-&gt; entspricht (*zeigerAufDiesesObjekt).
    // und das bedeutet: dereferenzieren (*) und darauf zugreifen (.)
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2293821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293821</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to Die this Zeiger on Sun, 27 Jan 2013 09:36:36 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Es war ja nur ein Beispiel. Mir fiel nichts besseres ein. ^^</p>
</blockquote>
<p>Schon klar, ich wollte nur sichergehen, dass ein Anfänger der das mal liest dann nicht alle seine zukünftigen Copy Assignment Operatoren mit sowas zukleistert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293822</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:36:36 GMT</pubDate></item></channel></rss>