<?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[kopie einer referenz?]]></title><description><![CDATA[<p>hi,</p>
<p>Ich lerne gerade C++ und kann mir ein Verhalten der Sprache nicht so recht erklären...<br />
Ich habe hier eine Funktion, der ich ein Objekt mittels call-by-reference übergeben soll, Funkionsdeklaration sieht so aus:</p>
<pre><code class="language-cpp">void sort(CFeld&lt;T, Max&gt;&amp; feld)
</code></pre>
<p>CFeld hat als Membervariable ein array:</p>
<pre><code class="language-cpp">private:
        T* m_feld;
</code></pre>
<p>In meiner Funktion benötige ich nun eine temporäre Kopie dieses Objektes.<br />
Zuerst habe ich sowas gemacht:</p>
<pre><code class="language-cpp">CFeld&lt;T, Max&gt; tempFeld = feld;
</code></pre>
<p>Bis mir dann aufgefallen ist, dass tempFeld dann auch nur eine weitere Referenz ist. Schonmal was gelernt. <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="🙂"
    /><br />
Jetzt habe ich das geändert in:</p>
<pre><code class="language-cpp">CFeld&lt;T, Max&gt; tempFeld = CFeld&lt;T, Max&gt;(feld);
</code></pre>
<p>Das funktioniert schon besser.<br />
Wie bekomme ich jetzt den Inhalt von tempFeld in mein feld hinein?<br />
Wenn ich sowas probiere:</p>
<pre><code class="language-cpp">feld = newFeld;
</code></pre>
<p>oder sowas:</p>
<pre><code class="language-cpp">feld = CFeld&lt;T, Max&gt;(newFeld);
</code></pre>
<p>...und mir dann in meiner main nach Aufruf der Funktion den Inhalt des arrays ausgeben lasse, kommt:</p>
<blockquote>
<p>feld = -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602</p>
</blockquote>
<p>erwartet hätte ich, dass der Compiler oder sonstwer meckert, versuche ich hier nicht, eine Referenz auf ein anderes Objekt &quot;umzubiegen&quot;, was ja nicht geht afaik?<br />
Ich bekomme nach Programmende auch immer eine &quot;Debug Assertion Failed&quot;-Nachricht.<br />
Was passiert denn nun mit feld in meinem Code? Und was passiert genau, wenn ich Referenzen kopiere? Und wo kommen die ganzen -17891602 her?</p>
<p>Ich habe jetzt erstmal ne for-Schleife eingebaut, die den Inhalt des member-Arrays von newFeld Stück für Stück in das von feld kopiert. Das funktioniert zwar, aber es bleibt das Gefühl, C++-Referenzen nicht verstanden zu haben</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233968/kopie-einer-referenz</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:30:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233968.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Feb 2009 13:09:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 13:09:53 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>Ich lerne gerade C++ und kann mir ein Verhalten der Sprache nicht so recht erklären...<br />
Ich habe hier eine Funktion, der ich ein Objekt mittels call-by-reference übergeben soll, Funkionsdeklaration sieht so aus:</p>
<pre><code class="language-cpp">void sort(CFeld&lt;T, Max&gt;&amp; feld)
</code></pre>
<p>CFeld hat als Membervariable ein array:</p>
<pre><code class="language-cpp">private:
        T* m_feld;
</code></pre>
<p>In meiner Funktion benötige ich nun eine temporäre Kopie dieses Objektes.<br />
Zuerst habe ich sowas gemacht:</p>
<pre><code class="language-cpp">CFeld&lt;T, Max&gt; tempFeld = feld;
</code></pre>
<p>Bis mir dann aufgefallen ist, dass tempFeld dann auch nur eine weitere Referenz ist. Schonmal was gelernt. <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="🙂"
    /><br />
Jetzt habe ich das geändert in:</p>
<pre><code class="language-cpp">CFeld&lt;T, Max&gt; tempFeld = CFeld&lt;T, Max&gt;(feld);
</code></pre>
<p>Das funktioniert schon besser.<br />
Wie bekomme ich jetzt den Inhalt von tempFeld in mein feld hinein?<br />
Wenn ich sowas probiere:</p>
<pre><code class="language-cpp">feld = newFeld;
</code></pre>
<p>oder sowas:</p>
<pre><code class="language-cpp">feld = CFeld&lt;T, Max&gt;(newFeld);
</code></pre>
<p>...und mir dann in meiner main nach Aufruf der Funktion den Inhalt des arrays ausgeben lasse, kommt:</p>
<blockquote>
<p>feld = -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602 -17891602</p>
</blockquote>
<p>erwartet hätte ich, dass der Compiler oder sonstwer meckert, versuche ich hier nicht, eine Referenz auf ein anderes Objekt &quot;umzubiegen&quot;, was ja nicht geht afaik?<br />
Ich bekomme nach Programmende auch immer eine &quot;Debug Assertion Failed&quot;-Nachricht.<br />
Was passiert denn nun mit feld in meinem Code? Und was passiert genau, wenn ich Referenzen kopiere? Und wo kommen die ganzen -17891602 her?</p>
<p>Ich habe jetzt erstmal ne for-Schleife eingebaut, die den Inhalt des member-Arrays von newFeld Stück für Stück in das von feld kopiert. Das funktioniert zwar, aber es bleibt das Gefühl, C++-Referenzen nicht verstanden zu haben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661732</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Wed, 11 Feb 2009 13:09:53 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 13:12:07 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>CFeld hat als Membervariable ein array:</p>
<pre><code class="language-cpp">private:
        T* m_feld;
</code></pre>
</blockquote>
<p>Das ist ein Zeiger, kein Array. Und dein Problem hat mit Referenzen nichts zu tun. Deiner Klasse fehlen Copykonstruktor und Zuweisungsoperator. Einfacher wäre es aber, aus diesem Zeiger einen vector&lt;T&gt; zu machen. Dann geht alles von ganz allein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661736</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 11 Feb 2009 13:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 13:21:53 GMT]]></title><description><![CDATA[<p>Das <code>m_feld</code> ist weder ein Array noch eine Referenz, sondern ein Zeiger. Das heisst, er zeigt irgendwo hin, wo die Daten gespeichert sind (zumindest sollte er das, oder auf Null).</p>
<p>Du musst also Speicher bereitstellen.</p>
<pre><code class="language-cpp">// Konstruktor der Klasse
MyClass::MyClass(int Size)
: m_feld(new T[Size])  // Array in der Initialisierungsliste anlegen
, m_size(Size)
{

}

// Destruktor
MyClass::~MyClass()
{
    delete[] m_feld;    // Speicher im Destruktor freigeben
}

// Kopierkonstruktor
MyClass::MyClass(const MyClass&amp; Origin)
: m_feld(new T[Origin.m_size])  // Dynamisches Array mit der Grösse des Originals anfordern
, m_size(Origin.m_size)
{
    std::copy(Origin.m_feld, Origin.m_feld + Origin.m_size, m_feld); // Inhalte kopieren
    // Eventuell könnte man auch std::uninitialized_copy()
    // und operator new verwenden
}

// Zuweisungsoperator
MyClass&amp; MyClass::operator= (const MyClass&amp; Origin)
{
    MyClass Temp(Origin);  // temporäres Objekt über Kopierkonstruktor initialisieren
    swap(Temp);    // schau mal nach Copy&amp;Swap-Idiom
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1661750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661750</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 11 Feb 2009 13:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 14:29:41 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>CFeld hat als Membervariable ein array:</p>
<pre><code class="language-cpp">private:
        T* m_feld;
</code></pre>
</blockquote>
<p>Das ist ein Zeiger, kein Array.</p>
</blockquote>
<p>Vorweg: Ich habe CFeld.h nicht selbst geschrieben, sondern vorgegeben bekommen, habe es allerdings etwas erweitert bisher.<br />
Mir ist anscheinend der Zusammenhang zwischen array und Zeiger nicht klar. in der Klasse selbst wird ganz zwangslos sowas wie</p>
<pre><code class="language-cpp">return m_feld[index];
</code></pre>
<p>benutzt. Bisher nahm ich an, dass array und Zeiger eigentlich dasselbe ist.</p>
<p>Wenn ich versuche, m_feld in ein array zu ändern, also</p>
<pre><code class="language-cpp">private:
        T m_feld[Max];
</code></pre>
<p>...bekomme ich im Konstruktor bei der Zeile</p>
<pre><code class="language-cpp">m_feld = new T[Max];
</code></pre>
<p>die Fehlermeldung</p>
<blockquote>
<p>error C2440: '=' : cannot convert from 'int *' to 'int [20]'</p>
</blockquote>
<p>Warum geht das nicht? Und wo ist der Unterschied zwischen einem Zeiger und einem array?</p>
<p>MFK schrieb:</p>
<blockquote>
<p>Und dein Problem hat mit Referenzen nichts zu tun.</p>
</blockquote>
<p>Vielleicht habe ich das etwas unübersichtlich präsentiert, ich habe 2 Klassen:<br />
CFeld&lt;T, Max&gt; war vorgegeben und hat ein array und dessen Länge als member<br />
CQuickSort&lt;T, Max&gt; hab ich selbst geschrieben und hat eine Funktion, die als Parameter eine Referenz auf ein CFeld nimmt:</p>
<pre><code class="language-cpp">void sort(CFeld&lt;T, Max&gt;&amp; feld)
</code></pre>
<p>MFK schrieb:</p>
<blockquote>
<p>Deiner Klasse fehlen Copykonstruktor und Zuweisungsoperator. Einfacher wäre es aber, aus diesem Zeiger einen vector&lt;T&gt; zu machen. Dann geht alles von ganz allein.</p>
</blockquote>
<p>Den Copykonstruktor hab ich geschrieben, der funktioniert auch, glaube ich.<br />
Aber wieso muss ich dann noch den Zuweisungsoperator überschreiben? Ich dachte, dass der standardmässig gerade den Kopierkonstruktor aufruft</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661798</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Wed, 11 Feb 2009 14:29:41 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 14:30:52 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>Wenn ich versuche, m_feld in ein array zu ändern, also</p>
<pre><code class="language-cpp">private:
        T m_feld[Max];
</code></pre>
<p>...bekomme ich im Konstruktor bei der Zeile</p>
<pre><code class="language-cpp">m_feld = new T[Max];
</code></pre>
<p>die Fehlermeldung</p>
<blockquote>
<p>error C2440: '=' : cannot convert from 'int *' to 'int [20]'</p>
</blockquote>
<p>Warum geht das nicht?</p>
</blockquote>
<p>weil ein array T[Max] nun mal kein zeiger ist.</p>
<blockquote>
<p>Und wo ist der Unterschied zwischen einem Zeiger und einem array?</p>
</blockquote>
<p><a href="https://de.wikipedia.org/wiki/Zeiger%20(Informatik)" rel="nofollow">Wikipedia: Zeiger (Informatik)</a><br />
<a href="https://de.wikipedia.org/wiki/Feld%20(Datentyp)" rel="nofollow">Wikipedia: Feld (Datentyp)</a></p>
<p><a href="https://www.google.de/search?&amp;q=c%2B%2B%20anf%C3%A4nger%20tutorial" rel="nofollow">Google: c++ anfänger tutorial</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661815</guid><dc:creator><![CDATA[powiwe]]></dc:creator><pubDate>Wed, 11 Feb 2009 14:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 14:35:35 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>Den Copykonstruktor hab ich geschrieben, der funktioniert auch, glaube ich.<br />
Aber wieso muss ich dann noch den Zuweisungsoperator überschreiben? Ich dachte, dass der standardmässig gerade den Kopierkonstruktor aufruft</p>
</blockquote>
<p>Nein. Standardmässig kopiert er memberweise, also nur die Zeiger selber. Schau dir doch einfach mal meinen Code an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661819</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 11 Feb 2009 14:35:35 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 15:18:18 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nein. Standardmässig kopiert er memberweise, also nur die Zeiger selber.</p>
</blockquote>
<p>Ok...verstehe ich das richtig, wenn ich weder Kopierkonstrukter noch Zuweisungsoperator explizit implementiere, werden beide vom Compiler erstellt und tun das gleiche, nämlich alle Membervariablen kopieren? Und falls ja, werden die Member dann wiederum mit ihrem eigenen Kopierkonstruktor kopiert, oder mit ihrem eigenen Zuweisungsoperator?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661866</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Wed, 11 Feb 2009 15:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Wed, 11 Feb 2009 16:02:11 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>Ok...verstehe ich das richtig, wenn ich weder Kopierkonstrukter noch Zuweisungsoperator explizit implementiere, werden beide vom Compiler erstellt und tun das gleiche, nämlich alle Membervariablen kopieren?</p>
</blockquote>
<p>Ja, sofern das geht. Hat man Referenzen oder konstante Objekte als Member, kann kein Zuweisungsoperator generiert werden. Hat man nichtkopierbare Objekte als Member, kann zusätzlich kein Kopierkonstruktor generiert werden.</p>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Und falls ja, werden die Member dann wiederum mit ihrem eigenen Kopierkonstruktor kopiert, oder mit ihrem eigenen Zuweisungsoperator?</p>
</blockquote>
<p>Ja. PODs haben zwar keine Konstruktoren, werden also bitweise kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661906</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 11 Feb 2009 16:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Thu, 12 Feb 2009 14:17:48 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ja, sofern das geht. Hat man Referenzen oder konstante Objekte als Member, kann kein Zuweisungsoperator generiert werden.</p>
</blockquote>
<p>Hm... Ich hab mir mal ne Klasse mit Referenzen und konstanten Objekten als Member geschrieben, und da scheint der Zuweisungsoperator einwandfrei zu funktionieren, also:</p>
<pre><code class="language-cpp">class CTest
{
public:
	CTest (int a, MyInt b, MyInt&amp; c)  : _a(a), _b(b), _c(c){};
	//...
	const int _a;
	const MyInt _b;
	MyInt&amp; _c;
};
</code></pre>
<p>In der main kann ich dann problemlos sowas machen:</p>
<pre><code class="language-cpp">MyInt ref(3);
CTest t1(1, MyInt(2), ref);
CTest t2 = t1;
</code></pre>
<p>Nexus schrieb:</p>
<blockquote>
<p>Hat man nichtkopierbare Objekte als Member, kann zusätzlich kein Kopierkonstruktor generiert werden.</p>
</blockquote>
<p>Wann ist denn ein Objekt nicht kopierbar? Wir hatten in der VL ein Entwurfsmuster namens &quot;Singleton&quot;, da wurde dann Kopierkonstruktor und Zuweisungsoperator privat deklariert, aber nicht implementiert, aber gibt es noch andere Möglichkeiten?</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Und falls ja, werden die Member dann wiederum mit ihrem eigenen Kopierkonstruktor kopiert, oder mit ihrem eigenen Zuweisungsoperator?</p>
</blockquote>
<p>Ja.</p>
</blockquote>
<p>Ja, Kopierkonstruktor, oder Ja, Zuweisungsoperator?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662535</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Thu, 12 Feb 2009 14:17:48 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Thu, 12 Feb 2009 15:25:02 GMT]]></title><description><![CDATA[<p>powiwe schrieb:</p>
<blockquote>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Wenn ich versuche, m_feld in ein array zu ändern, also</p>
<pre><code class="language-cpp">private:
        T m_feld[Max];
</code></pre>
<p>...bekomme ich im Konstruktor bei der Zeile</p>
<pre><code class="language-cpp">m_feld = new T[Max];
</code></pre>
<p>die Fehlermeldung</p>
<blockquote>
<p>error C2440: '=' : cannot convert from 'int *' to 'int [20]'</p>
</blockquote>
<p>Warum geht das nicht?</p>
</blockquote>
<p>weil ein array T[Max] nun mal kein zeiger ist.</p>
</blockquote>
<p>Ich verstehe es immer noch nicht. Ich kann mir ein array machen:</p>
<pre><code class="language-cpp">int a[3] = {1,2,3};
</code></pre>
<p>dann ist doch a ein Zeiger auf das erste Element?</p>
<pre><code class="language-cpp">cout &lt;&lt; a;
</code></pre>
<p>gibt mir doch ne Adresse aus, genau wie auch</p>
<pre><code class="language-cpp">int* b = new int;
cout &lt;&lt; b;
</code></pre>
<p>weiterhin kann ich mit a rechnen wie mit einem Zeiger, und auch b kann ich ansprechen wie ein array:</p>
<pre><code class="language-cpp">*(b+1) = 20;
cout &lt;&lt; *(a+1); // 2
cout &lt;&lt; b[1]; // 20
</code></pre>
<p>Hat es vielleicht etwas mit dynamischem und automatischem Speicher zu tun?<br />
Und wieso kann ich für die Grösse eines arrays keine Variable benutzen?</p>
<pre><code class="language-cpp">int a = 3;
int b[a] // Fehler
</code></pre>
<p>Im dynamischen Speicher ist das ja kein Problem:</p>
<pre><code class="language-cpp">int* d = new int[a];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1662596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662596</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Thu, 12 Feb 2009 15:25:02 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Thu, 12 Feb 2009 15:43:59 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>In der main kann ich dann problemlos sowas machen:</p>
<pre><code class="language-cpp">MyInt ref(3);
CTest t1(1, MyInt(2), ref);
CTest t2 = t1;
</code></pre>
</blockquote>
<p>Die letzte Zeile ist eine Initialisierung, keine Zuweisung.</p>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Ich verstehe es immer noch nicht. Ich kann mir ein array machen:</p>
<pre><code class="language-cpp">int a[3] = {1,2,3};
</code></pre>
<p>dann ist doch a ein Zeiger auf das erste Element?</p>
</blockquote>
<p>Nein. a ist der Name des Arrays. Der ist implizit in einen rvalue-int-Zeiger <em>konvertierbar</em>, der auf das erste Element zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662636</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 12 Feb 2009 15:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Thu, 12 Feb 2009 15:56:28 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>Ich verstehe es immer noch nicht. Ich kann mir ein array machen:</p>
<pre><code class="language-cpp">int a[3] = {1,2,3};
</code></pre>
<p>dann ist doch a ein Zeiger auf das erste Element?</p>
</blockquote>
<p>Nein, <code>a</code> ist der Name des Arrays.<br />
Der Unterschied wird auch so ersichtlich:</p>
<pre><code class="language-cpp">int a[3] = {1,2,3};
std::cout &lt;&lt; sizeof(a) &lt;&lt; '\n' //gibt 3 * sizeof(int) aus (vermutlich 12)

int* pa = a; //hier wird a implizit in einen Pointer konvertiert

std::cout &lt;&lt; sizeof(pa) &lt;&lt; '\n' //gibt die groesse von int* aus (vermutlich 4)

++a; //Fehler, man kann keine Pointerarithmetik mit Arrays machen, da Arrays keine Pointer sind

++pa; //geht -&gt; Pointerarithmetik
</code></pre>
<blockquote>
<pre><code class="language-cpp">cout &lt;&lt; a;
</code></pre>
<p>gibt mir doch ne Adresse aus, genau wie auch...</p>
</blockquote>
<p>Ja, weils implizit in einen Pointer konvertiert wird.</p>
<blockquote>
<pre><code class="language-cpp">int* b = new int;
cout &lt;&lt; b;
</code></pre>
</blockquote>
<p>Hier <strong>ist</strong> b wirklich ein Pointer.</p>
<blockquote>
<p>weiterhin kann ich mit a rechnen wie mit einem Zeiger, und auch b kann ich ansprechen wie ein array:</p>
<pre><code class="language-cpp">cout &lt;&lt; *(a+1); // 2
</code></pre>
</blockquote>
<p>Dabei wird ein temporärer Pointer erstellt, dieser wird um 1 erhöht und dann dereferenziert. a bleibt aber weiterhin das Array.<br />
`a = a + 1; //oder  ++a -&gt; FEHLER</p>
<p>std::cout &lt;&lt; *a</p>
<p>`<br />
geht hingegen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662642</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 12 Feb 2009 15:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Fri, 13 Feb 2009 12:47:15 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>In der main kann ich dann problemlos sowas machen:</p>
<pre><code class="language-cpp">MyInt ref(3);
CTest t1(1, MyInt(2), ref);
CTest t2 = t1;
</code></pre>
</blockquote>
<p>Das liegt daran, dass wenn der Zuweisungsoperator in der Deklaration vorkommt, es nicht wirklich der Zuweisungsoperator, sondern der Kopierkonstruktor ist, der aufgerufen wird.</p>
<pre><code class="language-cpp">CTest t2(t1);
</code></pre>
<p>wäre das Gleiche. Die Schreibweise mit = geht auch nur bei nicht expliziten Konstruktoren.</p>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Ja, Kopierkonstruktor, oder Ja, Zuweisungsoperator?</p>
</blockquote>
<p>Beim standardgenerierten Kopierkonstruktor werden die Member mit ihrem Kopierkonstruktor kopiert, beim Zuweisungsoperator werden sie mit ihrem Zuweisungsoperator zugewiesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663129</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 13 Feb 2009 12:47:15 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Fri, 13 Feb 2009 13:25:14 GMT]]></title><description><![CDATA[<p>Vorweg erstmal Danke für die hilfreichen Antworten.<br />
Dann noch ein paar Fragen:</p>
<blockquote>
<p>Hat man Referenzen oder konstante Objekte als Member, kann kein Zuweisungsoperator generiert werden.</p>
</blockquote>
<p>Ok... aber warum ist das so?<br />
Und überhaupt, warum gibts bei C++ die Unterscheidung von Kopie und Zuweisung?<br />
Mal ganz naiv: bei den Übungsprogrämmchen die ich bisher schreiben musste war die Funktion von Kopierktor und Zuweisung immer gleich, soweit ich das überblicken kann</p>
<p>Offen ist auch noch meine Frage, warum man Arrays auf dem Stack nicht mit variabler Grösse initialisieren kann...</p>
<p>Ausserdem: von Java bin ich es gewohnt, Objekte deklarieren zu können, ohne sie Initialisieren zu müssen, bzw sie werden auf NULL initialisiert, also:</p>
<pre><code class="language-java">MeineKlasse instanz;
</code></pre>
<p>(Ich hoffe das stimmt so, Java ist für mich laange her.)<br />
Wenn ich das bei C++ versuche:</p>
<pre><code class="language-cpp">CMeineKlasse instanz;
</code></pre>
<p>...versucht er immer gleich, den default-Ktor aufzurufen? Warum ist das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663180</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Fri, 13 Feb 2009 13:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Fri, 13 Feb 2009 13:38:42 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<blockquote>
<p>Hat man Referenzen oder konstante Objekte als Member, kann kein Zuweisungsoperator generiert werden.</p>
</blockquote>
<p>Ok... aber warum ist das so?</p>
</blockquote>
<p>Wenn du eine Klasse mit konstanten Membern (Referenzen sind <em>immer</em> konstant) zuweisen willst, müssen ja alle Member zugewiesen werden. Da einem konstanten Wert per Definition nichts zugewiesen werden kann, ist die Zuweisung der gesamten Klasse nicht möglich (zumindest beim standardgenerierten <code>operator=</code> ).</p>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Und überhaupt, warum gibts bei C++ die Unterscheidung von Kopie und Zuweisung?<br />
Mal ganz naiv: bei den Übungsprogrämmchen die ich bisher schreiben musste war die Funktion von Kopierktor und Zuweisung immer gleich, soweit ich das überblicken kann</p>
</blockquote>
<p>Kopie beinhaltet die Erstellung eines neuen Objekts. Das Objekt kann gerade mit den kopierten Werten <em>initialisiert</em> werden. Zuweisung hingegen verändert den Status eines bereits bestehenden Objekts.</p>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>Offen ist auch noch meine Frage, warum man Arrays auf dem Stack nicht mit variabler Grösse initialisieren kann...</p>
</blockquote>
<p>C++ hat dafür diesen Weg eingelegt. Möglich wäre es (-&gt; <code>alloca()</code> ), aber es ist auch meist sinnvoll, dafür den Heap zu benutzen. Vor allem weil dynamische Arrays oft grösser werden können und der Stack in seiner Grösse beschränkt ist. Aber mit der STL kann man dynamische Container sowieso viel komfortabler als jede Form von rohen Arrays benutzen, von daher ist die Einschränkung ertragbar.</p>
<p>Hackfresser schrieb:</p>
<blockquote>
<p>...versucht er immer gleich, den default-Ktor aufzurufen? Warum ist das so?</p>
</blockquote>
<p>Das ist auch eine Eigenschaft von C++. Willst du nur einen Verweis auf ein Objekt anlegen und das später initialisieren, kannst du Zeiger benutzen:</p>
<pre><code class="language-cpp">CMeineKlasse* Zeiger = 0; // zur Sicherheit mit Null initialisieren, um Ungültigkeit kennzuzeichnen
// ... mache etwas
Zeiger = new CMeineKlasse(/* Konstruktorargumente */);
// ... verwende Zeiger
delete Zeiger;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1663195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663195</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 13 Feb 2009 13:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Fri, 13 Feb 2009 14:26:57 GMT]]></title><description><![CDATA[<p>Sehr gut, danke Leute!<br />
Ich habe mit dem, was Ihr mir alles erklärt habt sogar meine ursprüngliche Frage selbst beantworten können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663240</guid><dc:creator><![CDATA[Hackfresser]]></dc:creator><pubDate>Fri, 13 Feb 2009 14:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to kopie einer referenz? on Fri, 13 Feb 2009 18:10:35 GMT]]></title><description><![CDATA[<p>Hackfresser schrieb:</p>
<blockquote>
<p>Ausserdem: von Java bin ich es gewohnt, Objekte deklarieren zu können, ohne sie Initialisieren zu müssen, bzw sie werden auf NULL initialisiert, also:</p>
</blockquote>
<p>In C++ gibt es eigentlich keine ungültige Objekte. Das, was am nächsten kommt ist der Zeiger, der 0 ist. Das ist allerdings ein gültiger Zeiger. Er zeigt auf kein Objekt, aber das Objekt ansich ist gültig. Die &quot;Ungültigkeit&quot; kommt vom Betrachter her, der dann sagt, dass man an eine Funktion keinen 0-Zeiger übergeben darf oder wie auch immer. Aber man kann durchaus auch mit 0 als Zeiger rechnen. Insbesondere Klasse Instanzen haben keinen Zustand, der mit NULL beschrieben werden kann. Die Ungültigkeit kommt auch hier wieder vom Programmierer aus, der sagt, dass eine bestimmte Klasse eine Invariante haben muss und ansonsten ist sie ungültig. (Und wirft allenfalls eine exception).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663374</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 13 Feb 2009 18:10:35 GMT</pubDate></item></channel></rss>