<?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[Zeiger und Referenzen]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>da ich immer noch Neuling bin und der Auffassung, dass man bei C++ sehr viel mehr hinsichtlich der Sprache denken und überlegen muss als in Java (finde dort kann man sich mehr auf die Umsetzung der Problemstellung konzentrieren und muss sich nicht soviel mit der Sprache und dem Standard auseinandersetzen - nichts desto trotz will ichs ja lernen, C++ meine ich!!!) wollte ich eine Frage stellen, die bestimmt schon oft beantwortet wurde (habe über die Suche dazu leider nix gefunden):</p>
<p>Wie verhält es sich in C++ bei folgender Situation:</p>
<p>In einer Methode erzeuge ich mit</p>
<pre><code class="language-cpp">... new ConstructorCall();
</code></pre>
<p>Einen Zeiger und weise ihn einer privaten Variablen der Klasse zu.<br />
Danach erzeuge ich in selber Methode einige Objekte wie folgt:</p>
<pre><code class="language-cpp">Object1 o1();
Object2 o1();
,,.
</code></pre>
<p>Diese Objektreferenzen setze ich nun über entsprechende Methoden in das Objekt, welches ich über new angelegt habe (Attributsetter) und werlasse nun die Methode.</p>
<p>Die private Klassenvariable hat in dieser Instanz nun einen gültigen Wert, aber was ist mit deren Attributen, die ich als Referenz in einer Methode gesetzt habe nachdem ich die Methode verlassen habe?</p>
<p>Leben die in der privaten Variablen weiter, bis delete() aufgerufen wird?</p>
<p>Wenn es zu diser Frage schon Antworten, FAQs etc. gibt bitte darauf verweisen!</p>
<p>Danke schon mal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166298/zeiger-und-referenzen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 17:21:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166298.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Nov 2006 21:49:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger und Referenzen on Mon, 27 Nov 2006 21:49:29 GMT]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>da ich immer noch Neuling bin und der Auffassung, dass man bei C++ sehr viel mehr hinsichtlich der Sprache denken und überlegen muss als in Java (finde dort kann man sich mehr auf die Umsetzung der Problemstellung konzentrieren und muss sich nicht soviel mit der Sprache und dem Standard auseinandersetzen - nichts desto trotz will ichs ja lernen, C++ meine ich!!!) wollte ich eine Frage stellen, die bestimmt schon oft beantwortet wurde (habe über die Suche dazu leider nix gefunden):</p>
<p>Wie verhält es sich in C++ bei folgender Situation:</p>
<p>In einer Methode erzeuge ich mit</p>
<pre><code class="language-cpp">... new ConstructorCall();
</code></pre>
<p>Einen Zeiger und weise ihn einer privaten Variablen der Klasse zu.<br />
Danach erzeuge ich in selber Methode einige Objekte wie folgt:</p>
<pre><code class="language-cpp">Object1 o1();
Object2 o1();
,,.
</code></pre>
<p>Diese Objektreferenzen setze ich nun über entsprechende Methoden in das Objekt, welches ich über new angelegt habe (Attributsetter) und werlasse nun die Methode.</p>
<p>Die private Klassenvariable hat in dieser Instanz nun einen gültigen Wert, aber was ist mit deren Attributen, die ich als Referenz in einer Methode gesetzt habe nachdem ich die Methode verlassen habe?</p>
<p>Leben die in der privaten Variablen weiter, bis delete() aufgerufen wird?</p>
<p>Wenn es zu diser Frage schon Antworten, FAQs etc. gibt bitte darauf verweisen!</p>
<p>Danke schon mal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182748</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Mon, 27 Nov 2006 21:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 28 Nov 2006 06:29:31 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Diese Objektreferenzen</p>
</blockquote>
<p>Ich denke von diesem Gedanken musst Du Dich als Java-Umsteiger zuerst verabschieden. Das sind keine Objektreferenzen, sondern die Objekte selbst. Das heisst sie belegen auf dem Stack genau den Speicher den sie benötigen (anders als &quot;Referenztypen&quot; in anderen Sprachen, wo auf dem Stack in Wirklichkeit nur ein Zeiger liegt).</p>
<blockquote>
<p>Diese Objektreferenzen setze ich nun über entsprechende Methoden in das Objekt, welches ich über new angelegt habe (Attributsetter) und werlasse nun die Methode.</p>
</blockquote>
<p>Da man Referenzen in C++ nicht zuweisen kann, sondern nur initialisieren, gehe ich davon aus, Du kopierst hier in Wirklichkeit die beiden Objekte in das mit new angelegte. Das heisst es existieren zunächst vier Objekte, zwei auf dem Stack und zwei innerhalb des mit new erzeugten, und bei der Zuweisung wird der Inhalt der beiden Stack-Objekte in das dritte kopiert. Aber das kann anhand eines Codebeispiels deinerseits sicher besser beurteilen <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 />
Am Ende der Methode sind o1 und o2 jedenfalls nicht mehr vorhanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182807</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Nov 2006 06:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 28 Nov 2006 07:22:40 GMT]]></title><description><![CDATA[<p>// Objekt selbst ,keine referenz<br />
MyClass oObjekt;</p>
<p>//Referenz erzeugen als Adresse des Objekts<br />
// Problem wir der aktuelle Block verlassen in dem oObjekt erzúgt wird<br />
// ist referenc ungütlig<br />
MyClass *pRef = &amp;Objekt;</p>
<p>// Lösung:<br />
MyClass *pRef = new MyClass();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182830</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Tue, 28 Nov 2006 07:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 28 Nov 2006 19:20:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>:</p>
<p>Hm, da hab ich mir in C++ die Referenzen wohl falsch eingeprägt und muss zusehen, dass ich das korrigiert bekomme!</p>
<p>Ich dachte bisher immer, dass in C++ eine Referenz auf ein Objekt so eine Art unveränderlicher Zeiger ist und nicht eine ganze Kopie auf das Objekt. So dass eine Referenz die Vorteile eines Zeigers bietet (wenig Speicher, Objekt ist nur einmal vorhanden), ohne dessen Nachteile in Kauf zu nehmen (es kann immer anderer Speicher an den Zeiger zugewiesen werden, so dass Objekte verloren gehen können).<br />
Daher auch die Bedingung, dass Referenzen immer auf gültige Objekte zeigen müssen.</p>
<p>Dass die Referenz nun eine komplette Kopie des Objektes sein soll haut mich ein bisschen um!</p>
<p>Hier mal ein Codebsp., was ich meinte:</p>
<pre><code class="language-cpp">class A
{
    methode(Object1&amp; o1, Object2&amp; o2);
}

class B
{
    andereMethode();
}

B::andereMethode()
{
    A *a = new A();
    Object1 o1();
    Object2 o2();

    a-&gt;methode(o1, o2);
}
</code></pre>
<p>Was passiert in Methode a mit o1 und o2 wenn &quot;andereMethode&quot; verlassen wird?</p>
<p>Dass das ganze mit Zeigern funktioniert weiss ich, wollte aber soviel wie möglich Referenzen benutzen (aus o.a. Überlegung zu Referenzen).</p>
<p>Ciao</p>
<p>Edit: Hab gerad beim Durchlesen meiner Antwort gesehen, dass das alles funktioniert, da ich in methode() zwar Referenzen übergebe, aber diese ja keinen Klassenvariablen von A zugewiesen werden können (da diese ja Referenzen sein und damit schon initialisiert sein müssten, oder aber Objekte, die dann eine Kopie darstellen würden - oder? Was würde denn mit solchen Objekten in A passieren, wenn man andereMethode verlässt?).</p>
<p>Aber was ist mit meiner Ansicht über Referenzen in C++ (also die mit &amp; im Parametertyp)? Liege ich hier so total falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183322</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 28 Nov 2006 19:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 28 Nov 2006 19:05:07 GMT]]></title><description><![CDATA[<p>A a = new A();</p>
<p>geht das denn???</p>
<p>müsste es nicht heißen A *a = new A(); bzw. A* a = new A();?<br />
und a-&gt;methode(...); der Aufruf dann sein????</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183330</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Tue, 28 Nov 2006 19:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 28 Nov 2006 19:20:57 GMT]]></title><description><![CDATA[<p>@Checker&amp;Murckser:</p>
<p>Stimmt sorry, da hab ich mich vertan!<br />
Korrigiert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183341</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 28 Nov 2006 19:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 28 Nov 2006 21:18:45 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>:<br />
Was passiert in Methode a mit o1 und o2 wenn &quot;andereMethode&quot; verlassen wird?</p>
</blockquote>
<p>Wenn Du die beiden Referenzen nur in methode verwendest kein Problem, da die Methode längst zurückgekehrt ist, wenn andereMethode verlassen wird. Das einzige was schiefgehen könnte ist wenn Du in methode die Adressen der Referenzen nimmst und irgendwo speicherst. Was macht methode denn mit den beiden Referenzen?</p>
<p>Ansonsten macht eine Referenz wohl das was Du meinst dass sie macht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1183414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183414</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Nov 2006 21:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Wed, 29 Nov 2006 18:08:04 GMT]]></title><description><![CDATA[<p>Es ist halt immer so ein Kreuz mit den REferenzen, wenn sie nicht richtig erklärt sind. Bei einer Referenz wird in C++ die Adresse des Zielobjektes übergeben (im Assembler ist das eine indirekte Adressierung, und damit 4 Byte).</p>
<p>Gruss Jerry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183988</guid><dc:creator><![CDATA[jerry]]></dc:creator><pubDate>Wed, 29 Nov 2006 18:08:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Wed, 29 Nov 2006 19:17:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>:<br />
Danke, dann behalt ich mal meine beschriebenen Gedanken zu den Referenzen so bei!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2284">@jerry</a>:<br />
Das ist ein Zeiger aber auch, nur dass ich diesem nen neuen Wert zuweisen kann und der Referenz nicht.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1184041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1184041</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Wed, 29 Nov 2006 19:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Wed, 29 Nov 2006 19:22:14 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9654">@Reth</a>: Der Zeiger ist eine eigenständige Variable, die eine Adresse als Inhalt aufnimmt(Daher veränderbar). Die Referenz wird intern anders dargestellt und ist eine feste Adresse auf das Objekt! Jerry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1184045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1184045</guid><dc:creator><![CDATA[jerry]]></dc:creator><pubDate>Wed, 29 Nov 2006 19:22:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Fri, 01 Dec 2006 22:35:16 GMT]]></title><description><![CDATA[<p>Danke nochmals!</p>
<p>Eine Frage noch:</p>
<p>Kann man denn sowas machen:</p>
<pre><code class="language-cpp">void klasse::methode(Param *p)
{
    P&amp; rp = (*p);
}
</code></pre>
<p>?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1185586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1185586</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Fri, 01 Dec 2006 22:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Sat, 02 Dec 2006 11:07:25 GMT]]></title><description><![CDATA[<p>P rp = (*p);</p>
<p>//rp -&gt; Objekt auf das der Zeiger zeigt</p>
<p>P *r = &amp;rp;</p>
<p>//r neuer zeiger auf das objekt</p>
<p>aber glaub</p>
<p>P &amp;rp= .. geht nich</p>
<p>weis aber nich genau</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1185705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1185705</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sat, 02 Dec 2006 11:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Sat, 02 Dec 2006 11:23:58 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>aber glaub</p>
<p>P &amp;rp= .. geht nich</p>
</blockquote>
<p>Natürlich geht das. Da man allerdings den Pointer dereferenziert muss man zuvor sicherstellen, dass dieser auch auf ein gültiges Objekt verweist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1185727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1185727</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 02 Dec 2006 11:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Sat, 02 Dec 2006 11:26:11 GMT]]></title><description><![CDATA[<p>@Boris:</p>
<pre><code class="language-cpp">P rp = (*p);
</code></pre>
<p>Erzeugt eine Kopie des Objekts auf das p zeigt.</p>
<p>Der Rest:</p>
<pre><code class="language-cpp">P&amp; rp = (*p);
</code></pre>
<p>geht tatsächlich. Dann ich rp eine Referenz auf das Objekt, auf das p zeigt. Aber Obacht: Das ist <strong>der</strong> klassische Fall um eine ungültige Referenz zu erzeugen, z.B. wenn p NULL ist oder ins Nirvana zeigt.<br />
EDIT: (s.a. HumeSikkins) die Dereferenzierung ist schon undefiniert, dürfte aber bei den meisten Compilern funktionieren, bis man rp selbst benutzt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1185730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1185730</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sat, 02 Dec 2006 11:26:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Referenzen on Tue, 22 May 2007 19:39:36 GMT]]></title><description><![CDATA[<p>Hallo nochmals,</p>
<p>nun muss ich nach langer Zeit nochmal ein bisschen wiederkauen (bin immer noch blutiger Anfänger).</p>
<p>Da ja nun Referenzen zumGlück doch keine komplette Objektkopien sind, habe ich mal eine Frage zum Umgang mit denselben:</p>
<p>Ich habe bei meinem Projekt mehrere Klassen (z.T. komplett statisch), die auf Anforderung Objekte erzeugen und diese auch intern in STL-Containern verwalten, da sie auch verschiedene Zugriffs- bzw. Suchmöglichkeiten auf die erzeugten Objekte anbieten.</p>
<p>Nun hab ich das so implementiert, dass die Methoden, welche die Objekte erzeugen, die Objekte mit new anlegen und den Zeiger in den jew. STL-Containern speichern und auch zurückgeben.</p>
<p>In den Destruktoren der Klassen, welche die Objekte erzeugen werden dann die STL-Container abgelaufen, die darin liegenden Zeiger mit einem delete bedacht und die Container geleert.</p>
<p>Meine Fragen dazu sind nun aber:</p>
<p>1. Was passiert in den statischen Klassen, die ja auch Objekte erzeugen und in statischen STL-Membervariablen ablegen? Wann werden hier die Objekte gelöscht (bzw. deren Zeiger mit delete bedacht)? Beim Beenden des Programmes?</p>
<p>2. Ist es sinnvoller den Objekterzeugungsmethoden als Rückgabewert eine Referenz (wenn möglich konstant) zu geben statt eines Zeigers auf das neu erzeugte Objekt? (Bei einem Zeiger kann ja jeder delete darauf aufrufen!)</p>
<p>Vielen Dank schon einmal<br />
Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290139</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 22 May 2007 19:39:36 GMT</pubDate></item></channel></rss>