<?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[Kleine Ctor Frage]]></title><description><![CDATA[<p>Hallo!</p>
<p>ein paar kleine Fragen zu Konstruktoren:</p>
<p>Wenn ich eine Klasse mit einer Referenz als Member habe:</p>
<pre><code class="language-cpp">class A {
int&amp; ref;
public:
   A(int i);
}
</code></pre>
<p>dann MUSS ich ref ja in der Initialisierungsliste von A::A() initialisieren.</p>
<p>1. Aber wie sieht das beim Zuweisungsoperator operator= aus? Da existiert das Objekt ja bereits und ref ist für alle Zeiten bereits gebunden. Wie setze ich also ref im operator= ?</p>
<p>2. Wenn A von einer Klasse B erbt, wird dann eigentlich IMMER der Default Ctor von B bei den Konstruktoren auferufen? Also wird zb hier:</p>
<pre><code class="language-cpp">A::A(const A&amp; a) { ... }
</code></pre>
<p>oder hier:</p>
<pre><code class="language-cpp">A::A(const A&amp; a) : myVar(a.myVar) { ... }
</code></pre>
<p>der Default Ctor von B aufgerufen, obwohl ich es nicht explizit schreibe? Muss ich den Aufruf vom, B-Ctor nur schreiben, wenn B keinen Default-Ctor hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242481/kleine-ctor-frage</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 01:04:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242481.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Jun 2009 12:01:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:01:15 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>ein paar kleine Fragen zu Konstruktoren:</p>
<p>Wenn ich eine Klasse mit einer Referenz als Member habe:</p>
<pre><code class="language-cpp">class A {
int&amp; ref;
public:
   A(int i);
}
</code></pre>
<p>dann MUSS ich ref ja in der Initialisierungsliste von A::A() initialisieren.</p>
<p>1. Aber wie sieht das beim Zuweisungsoperator operator= aus? Da existiert das Objekt ja bereits und ref ist für alle Zeiten bereits gebunden. Wie setze ich also ref im operator= ?</p>
<p>2. Wenn A von einer Klasse B erbt, wird dann eigentlich IMMER der Default Ctor von B bei den Konstruktoren auferufen? Also wird zb hier:</p>
<pre><code class="language-cpp">A::A(const A&amp; a) { ... }
</code></pre>
<p>oder hier:</p>
<pre><code class="language-cpp">A::A(const A&amp; a) : myVar(a.myVar) { ... }
</code></pre>
<p>der Default Ctor von B aufgerufen, obwohl ich es nicht explizit schreibe? Muss ich den Aufruf vom, B-Ctor nur schreiben, wenn B keinen Default-Ctor hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720996</guid><dc:creator><![CDATA[ctor]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:08:47 GMT]]></title><description><![CDATA[<p>Hi! <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>ctor schrieb:</p>
<blockquote>
<p>2. Wenn A von einer Klasse B erbt, wird dann eigentlich IMMER der Default Ctor von B bei den Konstruktoren auferufen? Also wird zb hier:</p>
<pre><code class="language-cpp">A::A(const A&amp; a) { ... }
</code></pre>
<p>der Default Ctor von B aufgerufen, obwohl ich es nicht explizit schreibe?</p>
</blockquote>
<p>Ja und zwar als erstes.</p>
<p>Außer Du gibst einen anderen Konstruktor an, aber ohne geht es (logischerweise) nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720999</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:08:47 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:06:46 GMT]]></title><description><![CDATA[<p>ctor schrieb:</p>
<blockquote>
<p>Wenn ich eine Klasse mit einer Referenz als Member habe:...<br />
dann MUSS ich ref ja in der Initialisierungsliste von A::A() initialisieren.</p>
<p>1. Aber wie sieht das beim Zuweisungsoperator operator= aus? Da existiert das Objekt ja bereits und ref ist für alle Zeiten bereits gebunden. Wie setze ich also ref im operator= ?</p>
</blockquote>
<p>Garnicht. Eine Zuweisung ist hier nicht möglich.</p>
<p>ctor schrieb:</p>
<blockquote>
<p>2. Wenn A von einer Klasse B erbt, wird dann eigentlich IMMER der Default Ctor von B bei den Konstruktoren auferufen? Also wird zb hier:</p>
</blockquote>
<p>Der Standard ist: Konstruktoren (mit Ausnahme des Kopierkonstruktors) rufen den Standardkonstruktor der Basisklasse auf (Im Falle des Kopierkonstruktors den Kopierkonstruktor der Basisklasse), sofern du es nicht anders in der Initialisierungsliste angibst:</p>
<pre><code class="language-cpp">class Base
{
   Base();
   Base(int i);
};

class Child : public Base
{
   Child()
   :   Base(1) // Aufruf von Base(int i) statt Base()
   {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1721001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721001</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:16:10 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>ctor schrieb:</p>
<blockquote>
<p>Wenn ich eine Klasse mit einer Referenz als Member habe:...<br />
dann MUSS ich ref ja in der Initialisierungsliste von A::A() initialisieren.</p>
<p>1. Aber wie sieht das beim Zuweisungsoperator operator= aus? Da existiert das Objekt ja bereits und ref ist für alle Zeiten bereits gebunden. Wie setze ich also ref im operator= ?</p>
</blockquote>
<p>Garnicht. Eine Zuweisung ist hier nicht möglich.</p>
</blockquote>
<p>Bedeutet das, dass man Objekte, die eine Referenz als Attribut besitzen, nicht zugewiesen werden können?</p>
<pre><code class="language-cpp">int i_1 = 1;
int i_2 = 2;

A a_1(i_1);
A a_2(i_2);

a_1 = a_2; // nicht möglich oder a_1.ref == i_1 ?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1721005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721005</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:18:23 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Bedeutet das, dass man Objekte, die eine Referenz als Attribut besitzen, nicht zugewiesen werden können?</p>
</blockquote>
<p>Genau. In Fällen, in denen eine Zuweisung erwünscht ist, sollte man Zeiger benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721007</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:20:31 GMT]]></title><description><![CDATA[<p>Danke für die schnellen Antworten! <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>asc schrieb:</p>
<blockquote>
<p>Garnicht. Eine Zuweisung ist hier nicht möglich.</p>
</blockquote>
<p>Öhm.. also heißt das, dass wenn eine Klasse eine Referenz als Member hat, ein operator= private gemacht werden muss?</p>
<p>asc schrieb:</p>
<blockquote>
<p>Der Standard ist: Konstruktoren (mit Ausnahme des Kopierkonstruktors) rufen den Standardkonstruktor der Basisklasse auf (Im Falle des Kopierkonstruktors den Kopierkonstruktor der Basisklasse), sofern du es nicht anders in der Initialisierungsliste angibst:</p>
</blockquote>
<p>Macht dann der automatish erzeugte Kopierkonstruktor im Grunde das hier (A erbt von B):</p>
<pre><code class="language-cpp">A::A(const A&amp; rhs) : B(rhs) { }
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721009</guid><dc:creator><![CDATA[ctor]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 12:32:13 GMT]]></title><description><![CDATA[<p>STL-Container benötigen aber nur den Kopierkonstruktor, oder?</p>
<p>Edit: Auch der Zuweisungsoperator wird benötigt: <a href="http://www.cpp-tutor.de/cpp/le18/le18_01.htm#objekte" rel="nofollow">http://www.cpp-tutor.de/cpp/le18/le18_01.htm#objekte</a></p>
<p>Das heißt also, dass Klassen, dessen Objekte STL-Containerfähig sein sollen keine Referenzen als Attribute besitzen dürfen. Sonst muss man mit Smart-Pointern arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721011</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 04 Jun 2009 12:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 13:03:45 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>STL-Container benötigen aber nur den Kopierkonstruktor, oder?</p>
<p>Edit: Auch der Zuweisungsoperator wird benötigt: <a href="http://www.cpp-tutor.de/cpp/le18/le18_01.htm#objekte" rel="nofollow">http://www.cpp-tutor.de/cpp/le18/le18_01.htm#objekte</a></p>
<p>Das heißt also, dass Klassen, dessen Objekte STL-Containerfähig sein sollen keine Referenzen als Attribute besitzen dürfen. Sonst muss man mit Smart-Pointern arbeiten.</p>
</blockquote>
<p>imho brauchen sie copy-ctor und std::swap - wenn man std::swap nicht spezialisiert hat, dann auch den zuweisungsoperator - ansonsten nicht...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721057</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 04 Jun 2009 13:03:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 13:11:56 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Bedeutet das, dass man Objekte, die eine Referenz als Attribut besitzen, nicht zugewiesen werden können?</p>
</blockquote>
<p>Oh, es gibt schon noch Möglichkeiten, aber nicht auf direkten Weg...</p>
<p>&quot;Wenn sich etwas nicht direkt umsetzen lässt, füge eine weitere Ebene der Indirektion hinzu.&quot;</p>
<p>In diesem Falle kann das Handle-Body Idiom eine entsprechende Umsetzung ermöglichen. Wobei dies (wenn nur für dieses Problem angewandt) das Sprichwörtliche schießen von Kanonen auf Spatzen ist.</p>
<p>Folgendes (ungetestet)</p>
<pre><code class="language-cpp">// A.h (Inkludeguards etc. weggelassen zur Vereinfachung)
#include &lt;memory&gt; // Ich meine hier den TR1-Header

class A
{
    public:
        A(int &amp; ref);
        A(A const &amp; rhs);
        A &amp; operator=(
            A const &amp; rhs);

    private:
        struct Impl;
        std::tr1::shared_ptr&lt;Impl&gt; impl;
};
</code></pre>
<pre><code class="language-cpp">#include &quot;A.h&quot;

struct A::Impl
{
    Impl(int &amp; value)
    : ref(ref)
    {}

    int &amp; ref;
};

A::A(int &amp; ref)
:   impl(new Impl(ref))
{
}

A::A(A const &amp; rhs)
:   impl(new Impl(*rhs.Impl))
{
}

A &amp; operator=(
    A const &amp; rhs)
{
    impl = new Impl(*rhs.Impl); // Über Kopierkonstruktor...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1721060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721060</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 04 Jun 2009 13:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Ctor Frage on Thu, 04 Jun 2009 14:31:22 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Bedeutet das, dass man Objekte, die eine Referenz als Attribut besitzen, nicht zugewiesen werden können?</p>
</blockquote>
<p>Nein, bedeutet es nicht. Es bedeutet rein technisch gesehen nur, dass Objekte, die eine Referenz als Attribut besitzen, nur dann zugewiesen werden können, wenn der Zuweisungsoperator diese Referenz nicht antastet. Dazu ist es nötig, dass er explizit implementiert wird. Ob es semantisch sinnvoll ist, ein Objekt zuweisbar zu machen das eine feste Referenz hat, ist wiederum was anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721123</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 04 Jun 2009 14:31:22 GMT</pubDate></item></channel></rss>