<?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[Klassen, Pointer und Funktionen]]></title><description><![CDATA[<p>Guten Mittag!</p>
<p>Aus irgendeinem Grund habe ich doch Schwierigkeiten mit C++, vor allem<br />
was die Pointer angeht.<br />
Ich habe mir jetzt nochmal diese Tutorials durchgelesen<br />
<a href="http://www.cplusplus.com/doc/tutorial/pointers/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/pointers/</a><br />
<a href="http://www.cplusplus.com/doc/tutorial/classes/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/classes/</a><br />
<a href="http://www.cplusplus.com/doc/tutorial/classes2/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/classes2/</a></p>
<p>aber ich verstehe wohl noch immer nicht ganz was vor sich geht.</p>
<p>Also, hier mal mein momentanes Problem:</p>
<p><a href="http://1.In" rel="nofollow">1.In</a> einer Klasse &quot;Kamera&quot; habe ich die private members Vec3f center und Vec3f Projection wie folgt deklariert:</p>
<pre><code class="language-cpp">private:
  Vec3f center;
  Vec3f projection;
</code></pre>
<p>2. Vec3f ist eine gegebene Klasse, u.a. mit folgenden Konstruktoren/Funktionen</p>
<pre><code class="language-cpp">Vec3f(const Vec3f &amp;V) {
    data[0] = V.data[0];
    data[1] = V.data[1];
    data[2] = V.data[2]; }

  float Length() const {
    float l = (float)sqrt( data[0] * data[0] +
		    data[1] * data[1] +
		    data[2] * data[2] );
    return l; }

  void Normalize() {
    float l = Length();
    if (l &gt; 0) {
      data[0] /= l;
      data[1] /= l;
      data[2] /= l; }}
</code></pre>
<p>Nun moechte ich gerne den Konstruktor meiner Klasse &quot;Kamera&quot; schreiben:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
...
}
</code></pre>
<p>An sich dachte ich mir das ist ja easy,peasy das geht einfach so:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
    this-&gt;center = center;  (1)
    this-&gt;projection = projection.Normalize();  (2)
}
</code></pre>
<p>Sodele.<br />
(1) Scheint auch zu funktionieren. Wenn ich das richtig sehe, ist this ja ein Pointer auf mein derzeitiges Kamera Objekt. Mit dem &quot;-&gt;&quot; dereferenziere ich auf den member &quot;center&quot; und KOPIERE das Objekt center dahin.<br />
(2) Klappt nicht und ich raff nicht warum. Kann mir da bitte jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262648/klassen-pointer-und-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 11:13:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262648.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Mar 2010 12:31:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 12:31:20 GMT]]></title><description><![CDATA[<p>Guten Mittag!</p>
<p>Aus irgendeinem Grund habe ich doch Schwierigkeiten mit C++, vor allem<br />
was die Pointer angeht.<br />
Ich habe mir jetzt nochmal diese Tutorials durchgelesen<br />
<a href="http://www.cplusplus.com/doc/tutorial/pointers/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/pointers/</a><br />
<a href="http://www.cplusplus.com/doc/tutorial/classes/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/classes/</a><br />
<a href="http://www.cplusplus.com/doc/tutorial/classes2/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/classes2/</a></p>
<p>aber ich verstehe wohl noch immer nicht ganz was vor sich geht.</p>
<p>Also, hier mal mein momentanes Problem:</p>
<p><a href="http://1.In" rel="nofollow">1.In</a> einer Klasse &quot;Kamera&quot; habe ich die private members Vec3f center und Vec3f Projection wie folgt deklariert:</p>
<pre><code class="language-cpp">private:
  Vec3f center;
  Vec3f projection;
</code></pre>
<p>2. Vec3f ist eine gegebene Klasse, u.a. mit folgenden Konstruktoren/Funktionen</p>
<pre><code class="language-cpp">Vec3f(const Vec3f &amp;V) {
    data[0] = V.data[0];
    data[1] = V.data[1];
    data[2] = V.data[2]; }

  float Length() const {
    float l = (float)sqrt( data[0] * data[0] +
		    data[1] * data[1] +
		    data[2] * data[2] );
    return l; }

  void Normalize() {
    float l = Length();
    if (l &gt; 0) {
      data[0] /= l;
      data[1] /= l;
      data[2] /= l; }}
</code></pre>
<p>Nun moechte ich gerne den Konstruktor meiner Klasse &quot;Kamera&quot; schreiben:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
...
}
</code></pre>
<p>An sich dachte ich mir das ist ja easy,peasy das geht einfach so:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
    this-&gt;center = center;  (1)
    this-&gt;projection = projection.Normalize();  (2)
}
</code></pre>
<p>Sodele.<br />
(1) Scheint auch zu funktionieren. Wenn ich das richtig sehe, ist this ja ein Pointer auf mein derzeitiges Kamera Objekt. Mit dem &quot;-&gt;&quot; dereferenziere ich auf den member &quot;center&quot; und KOPIERE das Objekt center dahin.<br />
(2) Klappt nicht und ich raff nicht warum. Kann mir da bitte jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866490</guid><dc:creator><![CDATA[HugoW]]></dc:creator><pubDate>Tue, 09 Mar 2010 12:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 12:45:41 GMT]]></title><description><![CDATA[<p>Ich sehe da keinen Fehler, bin aber auch noch nicht so erfahren, was C+ angeht.</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
    this-&gt;center = center;  (1)
    this-&gt;projection = projection.Normalize();  (2)
}
</code></pre>
<p>Ich würde versuchen andere Parameternamen und außerdem eine Initialisierungsliste zu verwenden.<br />
Also so in etwa:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center_, Vec3f projection_): center(center_), projection(projection_.Normalize()) { }
</code></pre>
<p>Das läuft allerdings auf's gleiche hinaus.</p>
<p>Was ist denn genau der Fehler? Gibt's eine Fehlermeldung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866498</guid><dc:creator><![CDATA[?!?]]></dc:creator><pubDate>Tue, 09 Mar 2010 12:45:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 12:51:19 GMT]]></title><description><![CDATA[<p>Wichtige Regel für die Zukunft: Wenn was nicht klapp gescheite Fehlermeldung posten.</p>
<ol>
<li>Ist es ein Problem beim Kompilieren, spuckt der Compiler genügend Info aus</li>
<li>Ist es ein Runtime-Problem steht da evtl. was auf der Console, ansonsten -&gt; Debugger verwenden</li>
</ol>
<p>Bei dir scheiterts am Kompilieren.<br />
Schau dir mal an was Vec3f::Normalize zurückliefert. Kannst du das Ergebnis einem anderen Vec3f zuweisen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866501</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 09 Mar 2010 12:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:02:00 GMT]]></title><description><![CDATA[<p>Hallo, danke euch beiden.<br />
Na, das war ja ein schoen dummer Fehler.<br />
Habe jetzt also die Zeile durch</p>
<pre><code class="language-cpp">this-&gt;projection = direction;
    this-&gt;projection.Normalize();
</code></pre>
<p>ersetzt und jetzt meckert zumindest der Compiler nicht mehr <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="🙂"
    /></p>
<p>Ich haette da aber noch eine Frage. Es ist naemlich zB auch gegeben:</p>
<pre><code class="language-cpp">static void Cross3(Vec3f &amp;c, const Vec3f &amp;v1, const Vec3f &amp;v2) {
    float x = v1.data[1]*v2.data[2] - v1.data[2]*v2.data[1];
    float y = v1.data[2]*v2.data[0] - v1.data[0]*v2.data[2];
    float z = v1.data[0]*v2.data[1] - v1.data[1]*v2.data[0];
    c.data[0] = x; c.data[1] = y; c.data[2] = z; }
</code></pre>
<p>In der Definition der Klasse Vec3f.</p>
<p>Warum steht da das &quot;&amp;&quot; bei den Parametern?<br />
Bedeutet das einfach, dass man der Funktion aus irgendeinem Grund Adressen uebergeben muss?<br />
Wenn dann aber in der Funktion selbst v1 statt &amp;v1 verwendet wird, was bedeutet das dann? Kapiert der Compiler dann selbst, dass mit v1 das Objekt gemeint ist, dass die Adresse &amp;v1 beeinhaltet?<br />
Mache ich Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866509</guid><dc:creator><![CDATA[HugoW]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:02:00 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:26:38 GMT]]></title><description><![CDATA[<p>?!? schrieb:</p>
<blockquote>
<p>Ich würde versuchen andere Parameternamen und außerdem eine Initialisierungsliste zu verwenden.</p>
</blockquote>
<p>Ob man andere Namen verwendet, oder nicht ist ziemlich egal (Ich bevorzuge sogar die Variante von ihm, mit gleichen Namen der Übergabeparameter). Wo du definitiv recht hast, ist mit der <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-259736.html" rel="nofollow">Initialisierungsliste</a>.</p>
<p>Nur zur Information. Du kannst auch in der Initialisierungsliste gleiche Bezeichner verwenden, da das linke Argument sich immer auf die Membervariable und das rechte auf den Scope (hier die Übergabeparameter) bezieht:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection)
:   center(center),
    projection(projection)
{
    projection.Normalize();
}
</code></pre>
<p>?!? schrieb:</p>
<blockquote>
<p>Das läuft allerdings auf's gleiche hinaus.</p>
</blockquote>
<p>Nein, tut es nicht. Die Initialisierungsliste steuert den Konstruktoraufruf, die Zuweisung im Konstruktorrumpf ist und bleibt eine nachträgliche Zuweisung (mit vorherigen Aufruf des Standardkonstruktors).</p>
<p>Aber nun zum eigentlichen Posting zurück:</p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>An sich dachte ich mir das ist ja easy,peasy das geht einfach so:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
    this-&gt;center = center;  (1)
    this-&gt;projection = projection.Normalize();  (2)
}
</code></pre>
<p>Sodele.<br />
(1) Scheint auch zu funktionieren. Wenn ich das richtig sehe, ist this ja ein Pointer auf mein derzeitiges Kamera Objekt. Mit dem &quot;-&gt;&quot; dereferenziere ich auf den member &quot;center&quot; und KOPIERE das Objekt center dahin.<br />
(2) Klappt nicht und ich raff nicht warum. Kann mir da bitte jemand helfen?</p>
</blockquote>
<p>Zu 1:<br />
a) this ist der Zeiger auf das Aktuelle Objekt der Klasse. Das mit der Dereferenzierung stimmt auch.<br />
b) Der Ausdruck Kopieren ist hier verkehrt. Du führst eine Zuweisung durch, da center an der Stelle bereits existiert. Über die Initialisierungsliste würdest du tatsächlich Kopieren, nicht Zuweisen (Zuweisungsoperator vs. Kopierkonstruktor).</p>
<p>Zu 2:<br />
Dies ist sogar mehr als logisch. Normalize hat den Rückgabewert void. Und du versuchst ein void dem Objekt projection zuzuweisen.</p>
<p>Hier gibt es nur zwei Wege:<br />
a) Du rufst Normalize nach der Zuweisung auf.<br />
b) Du sorgst dafür das Normalize ein Objekt oder eine Referenz zurückgibt.</p>
<p>Möglich wäre z.B. das folgende:</p>
<pre><code class="language-cpp">// Header
class Vec3f
{
    // ...
    Vec3f &amp; Normalize();
};

// Sorce
Vec3f &amp; Vec3f::Normalize()
{
    // ...
    return *this; // Gibt sich selbst zurück...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866515</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:12:18 GMT]]></title><description><![CDATA[<p>HugoW schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Vec3f(const Vec3f &amp;V) {
    data[0] = V.data[0];
    data[1] = V.data[1];
    data[2] = V.data[2]; }
</code></pre>
</blockquote>
<p>data ist wohl ein float Array, was? Du brauchst diesen Konstruktor nicht selbst schreiben, weil der Kopierkonstruktor, der vom Compiler automatisch generiert werden kann, hier genau das richtige tut (elementweises Kopieren).</p>
<p>HugoW schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection){
    this-&gt;center = center;  (1)
    this-&gt;projection = projection.Normalize();  (2)
}
</code></pre>
</blockquote>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection)
: center(center), projection(projection)
{
    this-&gt;center = center;  (1)
    this-&gt;projection.Normalize();
}
</code></pre>
<p>wobei ich <code>normalize</code> als freie Funktion geschrieben hätte:</p>
<pre><code class="language-cpp">inline Vec3f normalize(Vec3f v)
{
  v *= 1.f / v.Length();
  return v;
}
</code></pre>
<p>Das gilt auch für andere Funktionen, wie zB <code>cross3</code> oder <code>length</code> .</p>
<p>Bzgl <code>&amp;</code> als Teil einer Parameter/Variablen-Deklaration guck mal in Dein C++ Buch im Kapitel über Referenzen nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866516</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:12:27 GMT]]></title><description><![CDATA[<p>Zu deiner ersten Frage:<br />
Normalize() verändert das Objekt selbst und gibt nichts zurück. Daher funktioniert deine letzte Methode und nicht das was du anfangs geschrieben hast.</p>
<p>Das &amp; in der Parameterliste steht für Referenzen, was der Funktion erlaubt diese permanent zu verändern (so sie nicht const sind) und was verhindert das die Objekte kopiert werden müssen (unnötiger Overhead).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866517</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:17:25 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Bzgl <code>&amp;</code> als Teil einer Parameter/Variablen-Deklaration guck mal in Dein C++ Buch im Kapitel über Referenzen nach.</p>
</blockquote>
<p>Je nachdem, wo das <code>&amp;</code> steht, kann es etwas anderes bedeuten:</p>
<p>In Ausdrücken:<br />
- Adressoperator (unärer Präfix-Operator)<br />
- Bit-Und (binär, infix)</p>
<p>Als Teil eines Deklarators:<br />
- Referenz (verhält sich wie ein unärer Präfix-Operator)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866523</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:17:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:25:43 GMT]]></title><description><![CDATA[<p>HugoW schrieb:</p>
<blockquote>
<pre><code class="language-cpp">static void Cross3(Vec3f &amp;c, const Vec3f &amp;v1, const Vec3f &amp;v2);
  //...
</code></pre>
<p>Warum steht da das &quot;&amp;&quot; bei den Parametern?<br />
Bedeutet das einfach, dass man der Funktion aus irgendeinem Grund Adressen uebergeben muss?</p>
</blockquote>
<p>Nein. Es handelt sich hier um Referenzen, nicht um Zeiger.</p>
<p>Schau dir mal folgendes Programm an:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo1(int a)
{
    a = 2;
}

void foo2(int &amp; a)
{
    a = 3;
}

int main()
{
    int i = 1;

    std::cout &lt;&lt; i &lt;&lt; std::endl;
    foo1(i);
    std::cout &lt;&lt; i &lt;&lt; std::endl;
    foo2(i);
    std::cout &lt;&lt; i &lt;&lt; std::endl;
}
</code></pre>
<p>Die Ausgabe ist:</p>
<pre><code>1
1
3
</code></pre>
<p>Im ersten Fall (&quot;void foo1(int a)&quot;) wird die Übergabe als Kopie gemacht. Sprich innerhalb von der Funktion arbeitet man auf einer Kopie, nicht dem Original.</p>
<p>Im zweiten Fall (&quot;void foo2(int &amp; a)&quot;) übergibt man eine Referenz, einen sogenannten Aliasnamen. Im wesentlichen ist eine Referenz gleichbedeutend mit dem Originalwert. Eine Änderung an der Referenz wirkt sich direkt auf den Ursprungswert aus.</p>
<p>Mit Zeigern hast du aber nicht ganz unrecht. Referenzen können (müssen aber nicht!) intern als Zeiger umgesetzt sein. Im Gegensatz zu Zeigern kann man aber eine Referenz nicht nachträglich &quot;umbiegen&quot;, NULL ist unzulässig und zu guter Letzt bieten Referenzen eine Syntax wie du sie von &quot;normalen&quot; Objekten gewohnt bist.</p>
<p>Und hierzu noch etwas... Der folgende Konstruktor ist aus Performancesicht tendenziell problematisch:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection)
</code></pre>
<p>Du übergibst hier center und projection als Kopie. Bei Objekten ist es in der Regel besser statt einer Kopie eine konstante Referenz zu übergeben:</p>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f const &amp; center, Vec3f const &amp; projection)
// oder (gleichbedeutend)
Kamera::Kamera(const Vec3f &amp; center, const Vec3f &amp; projection)
</code></pre>
<p>Hier wird keine Kopie angelegt, aber gleichzeitig garantiert das der Wert des Objektes nicht geändert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866530</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 13:25:44 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Kamera::Kamera(Vec3f center, Vec3f projection)
: center(center), projection(projection)
{
    this-&gt;center = center;  (1)
    this-&gt;projection.Normalize();
}
</code></pre>
</blockquote>
<p>Upps, da habe ich die erste this-&gt; Zeile übersehen. Die muss natürlich weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866531</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 09 Mar 2010 13:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 19:04:49 GMT]]></title><description><![CDATA[<p>Hui hui,<br />
jetzt habe ich ja soviele Antworten bekommen, dass ich ganz durcheinander komme.<br />
Ich versuchs jetzt mal zu ordnen:</p>
<p>@allgemein:<br />
Die vorgegebenen Funktionen cross und Normalize will ich nicht ändern.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14941">@asc</a>:</p>
<p>- Initalisierungsliste:<br />
Aha, das ist ja interessant. Habe ich vorher noch nie gesehen, werds dann wohl mal anwenden, wenns in der Regel vorzuziehen ist.<br />
-</p>
<blockquote>
<p>b) Der Ausdruck Kopieren ist hier verkehrt. Du führst eine Zuweisung durch, da center an der Stelle bereits existiert. Über die Initialisierungsliste würdest du tatsächlich Kopieren, nicht Zuweisen (Zuweisungsoperator vs. Kopierkonstruktor).</p>
</blockquote>
<p>Hmmm....ich dachte bei einer Zuweisung wird der &quot;Inhalt&quot; des Objekts rechts des &quot;=&quot; in den Speicherplatz des Objekts links kopiert? Nein? Wie darf ich mir eine Zuweisung dann speichertechnisch vorstellen?</p>
<p>@ zu</p>
<pre><code class="language-cpp">static void Cross3(Vec3f &amp;c, const Vec3f &amp;v1, const Vec3f &amp;v2);
</code></pre>
<p>Okay, man übergibt also eine Referenz, wenn ich das richtig verstanden habe, ist das jedoch eine Adresse. (Steht hier doch auch so, oder: <a href="http://www.cplusplus.com/doc/tutorial/pointers/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/pointers/</a></p>
<blockquote>
<p>The address that locates a variable within memory is what we call a reference to that variable</p>
</blockquote>
<p>)</p>
<p>Ich habe den Unterschied zwischen Kopie und direktem ändern, dank ascs Beispiel verstanden, finde es aber irgendwie immernoch unlogisch. Wenn &amp;foo eine Adresse ist, ist es komisch, dass man damit wie mit einem normalen Objekt arbeiten kann.<br />
Wie übergebe ich einer Funktion denn dann richtige Adressen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866676</guid><dc:creator><![CDATA[HugoW]]></dc:creator><pubDate>Tue, 09 Mar 2010 19:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Tue, 09 Mar 2010 20:35:46 GMT]]></title><description><![CDATA[<p>HugoW schrieb:</p>
<blockquote>
<p>Ich habe den Unterschied zwischen Kopie und direktem ändern, dank ascs Beispiel verstanden, finde es aber irgendwie immernoch unlogisch. Wenn &amp;foo eine Adresse ist, ist es komisch, dass man damit wie mit einem normalen Objekt arbeiten kann.<br />
Wie übergebe ich einer Funktion denn dann richtige Adressen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Indem du einen Zeiger empfängst.</p>
<pre><code class="language-cpp">int foo (int&amp; f ){} // 1
int foo (int* pf ){} // 2

int main ()
{
  int n;
  foo ( n ); // ruft 1 auf
  foo ( &amp;n ); // ruft 2 auf
}
</code></pre>
<p>Hier darfst du den &amp; Operator nicht verwechseln, welcher (hier) 2 Bedeutungen hat. Wenn er bei einem Typen steht, dann macht er einen Referenztypen draus. Wenn er bei einer Variable steht, dann gibt dir der Operator die Adresse zum Objekt zurück. Ein Zeiger erwartet eine Adresse, also musst du den &amp;-Operator benutzen, um an die Adresse zu kommen.<br />
Die Referenz wird mit dem normalen Objekt initialisiert und erwartet somit keinen Zeiger des Objektes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866723</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 09 Mar 2010 20:35:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen, Pointer und Funktionen on Wed, 10 Mar 2010 07:55:44 GMT]]></title><description><![CDATA[<p>HugoW schrieb:</p>
<blockquote>
<p>-</p>
<blockquote>
<p>b) Der Ausdruck Kopieren ist hier verkehrt. Du führst eine Zuweisung durch, da center an der Stelle bereits existiert. Über die Initialisierungsliste würdest du tatsächlich Kopieren, nicht Zuweisen (Zuweisungsoperator vs. Kopierkonstruktor).</p>
</blockquote>
<p>Hmmm....ich dachte bei einer Zuweisung wird der &quot;Inhalt&quot; des Objekts rechts des &quot;=&quot; in den Speicherplatz des Objekts links kopiert? Nein? Wie darf ich mir eine Zuweisung dann speichertechnisch vorstellen?</p>
</blockquote>
<p>Das problem ist einfach das es zwei Formen gibt (Kopie und Zuweisung) die man sprachlich irgendwie auseinander halten sollte. Eine Kopie wird durch Aufruf des Kopierkonstruktors erledigt, man erstellt dabei ein neues Objekt mit als Kopie des ersten. Bei einer Zuweisung existiert das Zielobjekt bereits, und jeder Wert wird einzeln zugewiesen - Du kannst es zwar kopieren nennen, aber dann kommt man hier ein wenig in Namenskonflikt.</p>
<p>Und bestimmte Sachen kann man nicht zuweisen, sondern nur Kopieren (Referenzen, Konstanten...).</p>
<p>HugoW schrieb:</p>
<blockquote>
<p>@ zu</p>
<pre><code class="language-cpp">static void Cross3(Vec3f &amp;c, const Vec3f &amp;v1, const Vec3f &amp;v2);
</code></pre>
<p>Okay, man übergibt also eine Referenz, wenn ich das richtig verstanden habe, ist das jedoch eine Adresse.</p>
</blockquote>
<p>Vergiß hier einfach mal Zeiger. Referenzen mögen intern als Zeiger abgebildet werden (können unter Umständen aber vom Compiler gänzlich wegoptimiert werden), sind aber von der Behandlung etwas anderes. Unter C gab es nur die Zeiger, und dort hat sich Referenz in dem Zusammenhang im Sprachgebrauch etabliert. In C++ gibt es im wesentlichen drei Übergabeformen:</p>
<pre><code class="language-cpp">int foo1(int a);   // [1] Als Kopie (C, C++)
int foo2(int &amp; a); // [2] Als Referenz (C++)
int foo3(int * a); // [3] Als Zeiger (C, C++)
</code></pre>
<p>1. Hier wird eine Kopie angelegt und man arbeitet innerhalb der Funktion mit der Kopie.<br />
1.1 Diese Übergabeform ist für integrale Datentypen (int, float...) die Übliche.</p>
<p>2. Übergabe als Referenz. Wie sie intern abgebildet wird (ob nun wegoptimiert oder als Zeiger) vergiss hier einfach mal. Eine Referenz lässt sich wie die Originalvariable verwenden, sie IST (aus Programmierersicht) die Originalvariable.<br />
2.1 Diese Übergabeform sollte man verwenden, wenn man den Originalwert manipulieren will.<br />
2.2 Eine konstante Referenz sollte man der Übergabe als Kopie vorziehen, wenn man Objekte von Klassen/Strukturen übergeben will.<br />
2.3 Referenzen können keine temporären Variablen zugeordnet werden, Konstanten Referenzen schon (siehe Beispiel unten)</p>
<p>3. Übergabe als Zeiger. Ein Zeiger ist eine Adresse im Speicher und man muss ihn dereferenzieren um an das eigentliche Objekt zu gelangen. Zudem kann ein Zeiger die Adresse NULL (0) annehmen, um anzudeuten das kein Objekt übergeben wurde. Dies muss man auch bei der Programmierung berücksichtigen.<br />
3.1 Zeiger würde ich immer dann wählen, wenn ein Objekt nur optional ist.</p>
<p>Ein großes Problem das du hast, ist die Syntax. Bei einer Referenzübergabe gibst du niemals eine Adresse an, sondern rufst sie wie bei einer &quot;normalen&quot; Funktion auf. Nur Zeiger benötigen Adressen, und leider wird hier (dank C-Herkunft das &amp; Symbol als Adressoperator verwendet - Dies hat aber nichts mit einer Referenz zu tun):</p>
<pre><code class="language-cpp">int foo1(int a);   // [1] Als Kopie (C, C++)
int foo2(int &amp; a); // [2] Als Referenz (C++)
int foo3(int * a); // [3] Als Zeiger (C, C++)

int main()
{
    int zahl = 0;
    foo1(zahl);         // \ Hier unterscheiden sich vom Aufruf weder die
    foo2(zahl);         // / Übergabe als Kopie, noch als Referenz.
    foo1(3);            // Die Übergabe eines temporären Wertes geht aber
    // Fehler: foo2(3)     nicht mit (nicht-konstanten) Referenzen

    // Zeiger sind was ganz anderes...
    foo3(&amp;zahl);        // Hier dient &quot;&amp;&quot; als Adressoperator
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866810</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 10 Mar 2010 07:55:44 GMT</pubDate></item></channel></rss>