<?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[referenz &amp;amp; zeiger bei parametern&#x2F;konstruktoren (beginnerfrage)]]></title><description><![CDATA[<p>hallo allerseits!</p>
<p>ich bin neu sowohl im forum als auch im bereich von c/c++. grundsätzliche<br />
programmiergrundlagen sind mir einigermassen geläufig und ich versuche, mein<br />
wissen auf c/c++ auszudehnen.<br />
nicht ganz sicher bin ich mir, ob das thema nun hier rein oder vielleicht doch in<br />
die c ecke gehört, denn im grunde ist ja objektorientierung mit drinnen, zeiger<br />
und referenzen (und darum gehts ja im kern meiner frage) gehen allerdings auf c<br />
zurück... also bitte mich nicht gleich anschreien.</p>
<p>also, ich arbeite mich gerade durch das buch 'c++ programmierung' von andre<br />
willms und habe dort im kapitel zeiger folgendes beispielprogramm, das zeigen<br />
soll, wie man mit dem konstruktor übergebenen parametern klassenelemente<br />
initialisiert.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Referenz
{
	private:
	int &amp;a;
	int b;

	public:
	Referenz(int&amp;);
	void print(void);
};

Referenz::Referenz(int &amp;r) : a(r),b(3)
{
}

void Referenz::print(void)
{
	cout &lt;&lt; &quot;a=&quot; &lt;&lt; a &lt;&lt; &quot; b=&quot; &lt;&lt; b &lt;&lt; endl;
}

int main()
{
int willi=8;

Referenz t(willi);

	t.print();
	willi=5;
	t.print();

  return(0);
}
</code></pre>
<p>soweit so gut, mir leuchtet das einigermassen ein. allerdings steige ich bei der<br />
verwendung des adressoperators (&amp;) ein wenig aus. ich versuche mal das in worte<br />
zu fassen, was ich verstanden gehabt zu glauben meine:</p>
<p>bei erzeugung des objekts 't' in der main methode wird ja direkt die variable<br />
'willi' an den konstruktor übergeben (wird hier schon eine kopie davon erzeugt?),<br />
allerdings wird durch die parameterangabe (int &amp;r) im konstruktor doch<br />
eigentlich die adresse von 'r' (durch das '&amp;') geholt. meiner logik zufolge<br />
müsste es dann doch aber eigentlich (int* &amp;r) heissen, oder?</p>
<p>die frage geht insofern weiter, da dann ja die variable 'a' mit 'r'<br />
initialisiert wird (durch '... :a(r) ...). ist das r denn nun ein verkapptes<br />
'&amp;r' oder das wirkliche 'r' (also eine kopie von 'willi')?</p>
<p>darauf frage ich mich, ob der ausdruck in zeile 8 denn wirklich korrekt ist<br />
(offensichtlich ist er es, denn das ganze lässt sich kompilieren und<br />
funktioniert), denn es wird ja wiederrum durch das '&amp;' vor dem 'a' auf die<br />
adresse verwiesen und diese dann zu 'int'??? meiner logik nach müsste das doch<br />
eher 'int* (&amp;a)' sein, oder? wird das '&amp;' in zeile 8 durch die initialisierung<br />
etwa quasi unbedeutend?<br />
die printfunktion dereferenziert 'a' ja nicht, also scheint 'a' einfach eine<br />
gültige int-variable zu sein.</p>
<p>um die verwirrung komplett zu machen, habe ich den code zu folgendem umgebaut,<br />
was mir zur zeit (teilweise) einfacher nachvollziehbar scheint und die selben<br />
resultate in der ausgabe liefert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Referenz
{
	private:
	int* a;
	int b;

	public:
	Referenz(int&amp;);
	void print(void);
};

Referenz::Referenz(int &amp;r) : a(&amp;r),b(3)
{
}

void Referenz::print(void)
{
	cout &lt;&lt; &quot;a=&quot; &lt;&lt; *a &lt;&lt; &quot; b=&quot; &lt;&lt; b &lt;&lt; endl;
}

int main()
{
int willi=8;

Referenz t(willi);

	t.print();
	willi=5;
	t.print();

  return(0);
}
</code></pre>
<p>hier ist 'a' also wirklich ein zeiger wie ich es verstehe. eigentlich sollte<br />
hier dann keinerlei kopie von 'willi' erzeugt werden (im ersten fall bin ich mir<br />
da nicht so sicher).<br />
unklar bei dieser version ist mir jedoch z.b. , warum in der deklaration des<br />
konstruktors (zeile 12) als paraeter '(int&amp;)' steht, und nicht (int*).</p>
<p>hat irgendwer die nerven mir die punkte zu erklären?</p>
<p>ich danke euch schonmal für die mühe und verbleibe derweil mit grüssen an alle<br />
fleissigen coder - redchili</p>
<p>EDIT: je länger ich so drüber nachdenke... vielleicht sollte ich mir das '&amp;'<br />
weniger als operator, sondern vielmehr '&amp;a' als eine einheit vorstellen, die<br />
eben die adresse von 'a' darstellt... geht das in die richtige richtung?<br />
dann noch was - an den stellen, wo ich sowas schreibe wie &quot;...sollte das nicht<br />
xxx heissen...&quot; habe ich das schon ausprobiert und gemerkt dass es nicht geht;<br />
in diesen fällen gehts mir ums verständnis _warum_ es nicht geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/151092/referenz-amp-zeiger-bei-parametern-konstruktoren-beginnerfrage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 09:26:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/151092.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jun 2006 00:51:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to referenz &amp;amp; zeiger bei parametern&#x2F;konstruktoren (beginnerfrage) on Fri, 23 Jun 2006 01:02:21 GMT]]></title><description><![CDATA[<p>hallo allerseits!</p>
<p>ich bin neu sowohl im forum als auch im bereich von c/c++. grundsätzliche<br />
programmiergrundlagen sind mir einigermassen geläufig und ich versuche, mein<br />
wissen auf c/c++ auszudehnen.<br />
nicht ganz sicher bin ich mir, ob das thema nun hier rein oder vielleicht doch in<br />
die c ecke gehört, denn im grunde ist ja objektorientierung mit drinnen, zeiger<br />
und referenzen (und darum gehts ja im kern meiner frage) gehen allerdings auf c<br />
zurück... also bitte mich nicht gleich anschreien.</p>
<p>also, ich arbeite mich gerade durch das buch 'c++ programmierung' von andre<br />
willms und habe dort im kapitel zeiger folgendes beispielprogramm, das zeigen<br />
soll, wie man mit dem konstruktor übergebenen parametern klassenelemente<br />
initialisiert.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Referenz
{
	private:
	int &amp;a;
	int b;

	public:
	Referenz(int&amp;);
	void print(void);
};

Referenz::Referenz(int &amp;r) : a(r),b(3)
{
}

void Referenz::print(void)
{
	cout &lt;&lt; &quot;a=&quot; &lt;&lt; a &lt;&lt; &quot; b=&quot; &lt;&lt; b &lt;&lt; endl;
}

int main()
{
int willi=8;

Referenz t(willi);

	t.print();
	willi=5;
	t.print();

  return(0);
}
</code></pre>
<p>soweit so gut, mir leuchtet das einigermassen ein. allerdings steige ich bei der<br />
verwendung des adressoperators (&amp;) ein wenig aus. ich versuche mal das in worte<br />
zu fassen, was ich verstanden gehabt zu glauben meine:</p>
<p>bei erzeugung des objekts 't' in der main methode wird ja direkt die variable<br />
'willi' an den konstruktor übergeben (wird hier schon eine kopie davon erzeugt?),<br />
allerdings wird durch die parameterangabe (int &amp;r) im konstruktor doch<br />
eigentlich die adresse von 'r' (durch das '&amp;') geholt. meiner logik zufolge<br />
müsste es dann doch aber eigentlich (int* &amp;r) heissen, oder?</p>
<p>die frage geht insofern weiter, da dann ja die variable 'a' mit 'r'<br />
initialisiert wird (durch '... :a(r) ...). ist das r denn nun ein verkapptes<br />
'&amp;r' oder das wirkliche 'r' (also eine kopie von 'willi')?</p>
<p>darauf frage ich mich, ob der ausdruck in zeile 8 denn wirklich korrekt ist<br />
(offensichtlich ist er es, denn das ganze lässt sich kompilieren und<br />
funktioniert), denn es wird ja wiederrum durch das '&amp;' vor dem 'a' auf die<br />
adresse verwiesen und diese dann zu 'int'??? meiner logik nach müsste das doch<br />
eher 'int* (&amp;a)' sein, oder? wird das '&amp;' in zeile 8 durch die initialisierung<br />
etwa quasi unbedeutend?<br />
die printfunktion dereferenziert 'a' ja nicht, also scheint 'a' einfach eine<br />
gültige int-variable zu sein.</p>
<p>um die verwirrung komplett zu machen, habe ich den code zu folgendem umgebaut,<br />
was mir zur zeit (teilweise) einfacher nachvollziehbar scheint und die selben<br />
resultate in der ausgabe liefert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Referenz
{
	private:
	int* a;
	int b;

	public:
	Referenz(int&amp;);
	void print(void);
};

Referenz::Referenz(int &amp;r) : a(&amp;r),b(3)
{
}

void Referenz::print(void)
{
	cout &lt;&lt; &quot;a=&quot; &lt;&lt; *a &lt;&lt; &quot; b=&quot; &lt;&lt; b &lt;&lt; endl;
}

int main()
{
int willi=8;

Referenz t(willi);

	t.print();
	willi=5;
	t.print();

  return(0);
}
</code></pre>
<p>hier ist 'a' also wirklich ein zeiger wie ich es verstehe. eigentlich sollte<br />
hier dann keinerlei kopie von 'willi' erzeugt werden (im ersten fall bin ich mir<br />
da nicht so sicher).<br />
unklar bei dieser version ist mir jedoch z.b. , warum in der deklaration des<br />
konstruktors (zeile 12) als paraeter '(int&amp;)' steht, und nicht (int*).</p>
<p>hat irgendwer die nerven mir die punkte zu erklären?</p>
<p>ich danke euch schonmal für die mühe und verbleibe derweil mit grüssen an alle<br />
fleissigen coder - redchili</p>
<p>EDIT: je länger ich so drüber nachdenke... vielleicht sollte ich mir das '&amp;'<br />
weniger als operator, sondern vielmehr '&amp;a' als eine einheit vorstellen, die<br />
eben die adresse von 'a' darstellt... geht das in die richtige richtung?<br />
dann noch was - an den stellen, wo ich sowas schreibe wie &quot;...sollte das nicht<br />
xxx heissen...&quot; habe ich das schon ausprobiert und gemerkt dass es nicht geht;<br />
in diesen fällen gehts mir ums verständnis _warum_ es nicht geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083482</guid><dc:creator><![CDATA[redchili]]></dc:creator><pubDate>Fri, 23 Jun 2006 01:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to referenz &amp;amp; zeiger bei parametern&#x2F;konstruktoren (beginnerfrage) on Fri, 23 Jun 2006 10:27:29 GMT]]></title><description><![CDATA[<p>Das &amp;-Zeichen wird in C++ quasi doppelt verwendet, einmal als Adress-Operator und einmal als Referenz-Zeichen.</p>
<p>Wenn man bei einer Deklaration das &amp;-Zeichen angibt, dann bedeutet das, daß bei der Parameterübergabe keine Kopie sondern die Adresse der Variablen übergeben wird.<br />
Eine Referenz ist intern (fast) dasselbe wie ein Zeiger, aber man braucht nicht immer beim Zugriff auf die Variable den Wert dereferenzieren (z.B. *a).</p>
<p>Deine 2. Version entspricht von der Logik her genau der 1. Version, aber trotzdem sollte man in C++ besser mit Referenzen arbeiten anstatt mit Zeigern.</p>
<p>Gerade bei Klassen als Parameter werden (konstante) Referenzen eingesetzt, z.B.</p>
<pre><code class="language-cpp">void f(std::string &amp;s)
{
  s += &quot;x&quot;;  // hier wird direkt der übergebene String verändert
};

// oder konstant

void f(const std::string &amp;s)
{
  std::cout &lt;&lt; s &lt;&lt; std::endl; // nur lesender Zugriff auf den String (daher als konstant deklariert)
};
</code></pre>
<p>Ich glaube du verwirrst dich ein wenig selber, wenn du zu sehr mit Zeigern denkst...</p>
<p>P.S. Referenzen gibt es in &quot;C&quot; nicht, sondern sind erst in &quot;C++&quot; dazugekommen, daher bist du schon im richtigen Forum -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083695</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 23 Jun 2006 10:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to referenz &amp;amp; zeiger bei parametern&#x2F;konstruktoren (beginnerfrage) on Fri, 23 Jun 2006 11:15:43 GMT]]></title><description><![CDATA[<p>eine referenz ist ein alias, also ein alternativer name, für ein objekt. damit besteht eine gewisse verwandtschaft mit zeigern:</p>
<pre><code class="language-cpp">int foo;
int&amp; bar = foo;
int* baz = &amp;foo;
</code></pre>
<p>hier übernehmen bar und der ausdruck *baz die identität von foo. es ist auch eine plausible annahme, dass der compiler in fällen, in denen der initialisierer der referenz nicht im scope ist (also bei funktionsargumenten oder kalssenmembern), referenzen intern mit hilfe von zeigern implementiert. das ist allerdings nicht der wesentliche punkt. weil eine referenz das objekt IST, mit dem sie initialisiert wurde, ist es z.b. nicht möglich, die referenz auf ein anderes objekt verweisen zu lassen. darin ähnelt es konstanten pointern, allerdings sind pointer objekte aus eigenem recht. da referenzen wie pointer auf objekte verweisen, gelten für ihre initialisierer dem grunde nach dieselben anforderungen. man kann sie also z.b. nicht mit einem wert initialisieren:</p>
<pre><code class="language-cpp">int&amp; a = 5; // fehler: kein lvalue
int* b = &amp;5; // dito, 5 hat keine adresse
</code></pre>
<p>eine ausnahme gilt für referenzen auf konstante objekte. hier wird gegebenenfalls ein temporäres objekt erstellt und die referenz daran gebunden. das temporäre objekt lebt dann in der regel solange, wie die referenz existiert. ein referenz auf konstantes T kann auch mit einer variable vom typ T, die nicht konstant ist, initialisiert werden (so wie zeiger auf konstantes T mit zeigern auf nicht konstantes T initilisiert werden können).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083736</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 23 Jun 2006 11:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to referenz &amp;amp; zeiger bei parametern&#x2F;konstruktoren (beginnerfrage) on Fri, 23 Jun 2006 17:10:38 GMT]]></title><description><![CDATA[<p>vielen dank euch beiden für die antworten!<br />
langsam klärt sich der nebel ein wenig; in dem buch ist irgendwie nicht explizit<br />
die sache mit der doppelverwendung des '&amp;' rübergekommen.</p>
<p>ein detail würde mich aber dennoch interessieren:<br />
wenn ich also einer funktion (oder meinetwegen auch einem kostruktor) als paramter<br />
eine referenz deklariere &amp; definiere, dann kann ich innerhalb dieser auf die<br />
variable direkt zugreifen (also ohne &amp;)? also z.b.</p>
<pre><code class="language-cpp">void f(int &amp;i){ 
   i += 2;  // zugriff aufs &quot;referenzierte&quot; i
   int j = i;  // zuweisung des wertes von i an lokale variable (kopie!!!)
   int&amp; k = i;  // was aber ist das? hier wird wohl die referenz kopiert (?)
}
</code></pre>
<p>aufbauend auf dieser logik verstehe ich glaube ich, was mich in meinem allerersten<br />
beispiel (das aus dem buch) so irritiert hat. zur erinnerung:</p>
<pre><code class="language-cpp">class Referenz
{
    private:
    int &amp;a;   // das hat mich verwirrt
    int b;

    public:
    Referenz(int&amp;);
    void print(void);
};

Referenz::Referenz(int &amp;r) : a(r),b(3) { // nix }
</code></pre>
<p>und zwar verstehe ich es jetzt so, dass bei der initialisierung von 'a' mit 'r'<br />
im konstruktor ( durch a(r) ) 'r' bereits die referenz ist, die ja aufgrund der<br />
eigenschaft einer referenz nicht wie ein zeiger dereferenziert werden muss.<br />
wenn jetzt in zeile 4 statt 'int &amp;a;' lediglich 'int a;' stehen würde, dann<br />
würde ich damit a zu einer eigenen int-instanz machen und hätte mir das ganze<br />
übergeben der referenz auch sparen können, da 'a' jetzt unabhängig von der als<br />
parameter übergebenen variable ist (auch wenn sie im moment deren wert kopiert<br />
hat).<br />
dadurch dass da aber 'int &amp;a;' steht, wird neben 'r' also noch eine referenz auf<br />
die ursprüngliche variable erzeugt, sprich ich benötige nur einmal speicherplatz<br />
für den ursprünglichen wert, aber habe ihn zugreifbar durch 'r' und 'a'<br />
innerhalb des konstruktors, durch 'a' innerhalb des objektes und dann noch durch<br />
das, wo der aufruf der funktion (bzw konstruktor) mit dem parameter stattfindet.</p>
<p>*puh* , ich hoffe das stimmt so... bitte bitte sagt mir wer dass ichs jetzt<br />
richtig vertanden hab!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1084030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1084030</guid><dc:creator><![CDATA[redchili]]></dc:creator><pubDate>Fri, 23 Jun 2006 17:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to referenz &amp;amp; zeiger bei parametern&#x2F;konstruktoren (beginnerfrage) on Sun, 25 Jun 2006 13:47:56 GMT]]></title><description><![CDATA[<p>Ja, stimmt genau, was du geschrieben hast (bin beeindruckt - meine es ehrlich, das sich doch noch Leute intensiv mit der Programmierung auseinandersetzen - wenn ich dazu manchmal andere Fragen hier sehe...)</p>
<p>Um das mit den Referenzen auch direkt im Programmcode zu sehen, sollte man für den Kostruktor-Parameter und die Member-Variable denselben Namen verwenden (oder aber ein Präfix, z.B. &quot;m_&quot;)</p>
<p>Nicht wundern, aber dies geht wirklich:</p>
<pre><code class="language-cpp">class X
{
private:
    int &amp;a; // oder eben m_a;

public:
    X(int&amp; a);
};

X::X(int &amp;a)
  : a(a) // &lt;- dies funktioniert, oder auch &quot;m_a(a)&quot;
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1085137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1085137</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 25 Jun 2006 13:47:56 GMT</pubDate></item></channel></rss>