<?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[Frage zu Konstruktor aus Buch Beispiel]]></title><description><![CDATA[<p>Morgen, wofür steht hier .year();</p>
<pre><code class="language-cpp">Date::Date() :
     y(default_date(). year() )
{

}
</code></pre>
<p>Soweit hab ich das Beispiel verstanden:</p>
<p>Zuerst wird</p>
<pre><code class="language-cpp">Date::Date()
</code></pre>
<p>aufgerufen danach</p>
<pre><code class="language-cpp">default_date()
</code></pre>
<p>und default_date() wiederrum ruft den Konstruktor</p>
<pre><code class="language-cpp">Date::Date(int yy, Month mm, int dd) :
     y(yy), m(mm), d(dd)
</code></pre>
<p>auf hier werden dann die privaten Variablen initialisiert.<br />
Danach lande ich wieder</p>
<pre><code class="language-cpp">default_date()
</code></pre>
<p>Konstruktor und dann wird ein Statisches Konstantes Objekt zurückgeben? Wofür eigentlich wer erhält das dann?<br />
[Wenn ich das return dd; entferne funktioniert das Programm trotzdem]</p>
<p>Jetzt befinde ich mich wieder im Konstrutkro</p>
<pre><code class="language-cpp">Date::Date()
</code></pre>
<p>und jetzt wird die Funktion</p>
<pre><code class="language-cpp">int year() const
</code></pre>
<p>aufgerufen diese Funktion gibt die Variable y wieder wer erhält den Wert der Variable y jetzt an der Stelle?</p>
<p>Im Buch wird die Stelle leider nicht wirklich ausführlich erklärt ...</p>
<pre><code class="language-cpp">//
// This is example code from Chapter 9.7.3 &quot;Default constructors&quot; of
// &quot;Programming -- Principles and Practice Using C++&quot; by Bjarne Stroustrup
//

#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

//------------------------------------------------------------------------------

class Date {
public:
    enum Month {
        jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };

    Date();                         // default constructor

    Date(int yy, Month mm, int dd); // constructor

    int   year() const
    {
        cout&lt;&lt;&quot;year aufgerufen&quot;&lt;&lt;endl;
        return y;
    }

private:
    int   y;
    Month m;
    int   d;
};

//------------------------------------------------------------------------------

const Date&amp; default_date()
{
    static const Date dd(2001,Date::jan,1);
    return dd;
}

//------------------------------------------------------------------------------

Date::Date() :

     y(default_date(). year() )
{

}

//------------------------------------------------------------------------------

Date::Date(int yy, Month mm, int dd) :
     y(yy), m(mm), d(dd)
{
}

//------------------------------------------------------------------------------

int main()
{
    vector&lt;Date&gt; birthdays(10);

  cout&lt;&lt;&quot;Ausgabe: &quot; &lt;&lt; birthdays[0].year();

    /*/
    // Without the default constructor, we would have had to be explicit:
    {
        vector&lt;Date&gt; birthdays(10,default_date());
    }
    /*/

system(&quot;PAUSE&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/307014/frage-zu-konstruktor-aus-buch-beispiel</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 06:25:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307014.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Aug 2012 08:17:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 08:17:00 GMT]]></title><description><![CDATA[<p>Morgen, wofür steht hier .year();</p>
<pre><code class="language-cpp">Date::Date() :
     y(default_date(). year() )
{

}
</code></pre>
<p>Soweit hab ich das Beispiel verstanden:</p>
<p>Zuerst wird</p>
<pre><code class="language-cpp">Date::Date()
</code></pre>
<p>aufgerufen danach</p>
<pre><code class="language-cpp">default_date()
</code></pre>
<p>und default_date() wiederrum ruft den Konstruktor</p>
<pre><code class="language-cpp">Date::Date(int yy, Month mm, int dd) :
     y(yy), m(mm), d(dd)
</code></pre>
<p>auf hier werden dann die privaten Variablen initialisiert.<br />
Danach lande ich wieder</p>
<pre><code class="language-cpp">default_date()
</code></pre>
<p>Konstruktor und dann wird ein Statisches Konstantes Objekt zurückgeben? Wofür eigentlich wer erhält das dann?<br />
[Wenn ich das return dd; entferne funktioniert das Programm trotzdem]</p>
<p>Jetzt befinde ich mich wieder im Konstrutkro</p>
<pre><code class="language-cpp">Date::Date()
</code></pre>
<p>und jetzt wird die Funktion</p>
<pre><code class="language-cpp">int year() const
</code></pre>
<p>aufgerufen diese Funktion gibt die Variable y wieder wer erhält den Wert der Variable y jetzt an der Stelle?</p>
<p>Im Buch wird die Stelle leider nicht wirklich ausführlich erklärt ...</p>
<pre><code class="language-cpp">//
// This is example code from Chapter 9.7.3 &quot;Default constructors&quot; of
// &quot;Programming -- Principles and Practice Using C++&quot; by Bjarne Stroustrup
//

#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

//------------------------------------------------------------------------------

class Date {
public:
    enum Month {
        jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };

    Date();                         // default constructor

    Date(int yy, Month mm, int dd); // constructor

    int   year() const
    {
        cout&lt;&lt;&quot;year aufgerufen&quot;&lt;&lt;endl;
        return y;
    }

private:
    int   y;
    Month m;
    int   d;
};

//------------------------------------------------------------------------------

const Date&amp; default_date()
{
    static const Date dd(2001,Date::jan,1);
    return dd;
}

//------------------------------------------------------------------------------

Date::Date() :

     y(default_date(). year() )
{

}

//------------------------------------------------------------------------------

Date::Date(int yy, Month mm, int dd) :
     y(yy), m(mm), d(dd)
{
}

//------------------------------------------------------------------------------

int main()
{
    vector&lt;Date&gt; birthdays(10);

  cout&lt;&lt;&quot;Ausgabe: &quot; &lt;&lt; birthdays[0].year();

    /*/
    // Without the default constructor, we would have had to be explicit:
    {
        vector&lt;Date&gt; birthdays(10,default_date());
    }
    /*/

system(&quot;PAUSE&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2241689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241689</guid><dc:creator><![CDATA[Bjarne]]></dc:creator><pubDate>Tue, 14 Aug 2012 08:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 08:24:04 GMT]]></title><description><![CDATA[<p>Bjarne schrieb:</p>
<blockquote>
<p>Morgen, wofür steht hier .year();</p>
<pre><code class="language-cpp">Date::Date() :
     y(default_date(). year() )
{

}
</code></pre>
</blockquote>
<p>Du solltest hier lieber kein Leerzeichen setzen. y wird mit dem Ergebnis des Ausdrucks &quot;default_date().year()&quot; initialisiert.</p>
<p>default_date ist eine globale Funktion, die einmalig ein Date-Objekt mit dem Datum 1.1.2001 erzeugt. Anschließend wird die Methode year() des Objektes aufgerufen, die einen Integerwert (das Jahr, also 2001) zurückliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241691</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 14 Aug 2012 08:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 13:36:03 GMT]]></title><description><![CDATA[<p>2 Frage habe ich noch:</p>
<p>Wo ist der Sinn hier nochmal year() im Konstruktor aufzurufen?</p>
<pre><code class="language-cpp">Date::Date() : y(default_date(). year() )/cpp]

Ich mein die Variable y wird doch schon in diesem Konstruktor initialisiert:
[cpp]Date::Date(int yy, Month mm, int dd) : y(yy), m(mm), d(dd)
</code></pre>
<p>Und wo ist der Sinn hier nochmal return dd; zu schreiben? Wenn ich das weglasse dann funktioniert das Programm auch.</p>
<pre><code class="language-cpp">const Date&amp; default_date()
{
    static const Date dd(2001,Date::jan,1);
    return dd;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2241807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241807</guid><dc:creator><![CDATA[Bjarne]]></dc:creator><pubDate>Tue, 14 Aug 2012 13:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 13:48:41 GMT]]></title><description><![CDATA[<p>default_date() ist eine statische Methode, die dir ein Datum (&quot;01.01.2001&quot;) erstellt.</p>
<p>year() ist eine nicht-statische Methode, die dir das Jahr der Instanz zurückgibt, auf dem diese Methode aufgerufen wurde.</p>
<p>und &quot;return dd&quot; bedeutet, dass der Wert der Variable &quot;dd&quot; als Rückgabewert verwendet wird. Wenn dein Programm auch ohne diesen Aufruf funktioniert, dann gibt es mehrere Möglichkeiten:</p>
<p>1. Dein Compiler ist extrem tolerant<br />
2. dein Compiler hat eine gut funktionierende Glaskugel<br />
3. dein Programm funktioniert nur zufällig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241810</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 14 Aug 2012 13:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 13:52:12 GMT]]></title><description><![CDATA[<p>Bjarne schrieb:</p>
<blockquote>
<p>2 Frage habe ich noch:</p>
<p>Wo ist der Sinn hier nochmal year() im Konstruktor aufzurufen?</p>
<pre><code class="language-cpp">Date::Date() : y(default_date(). year() )/cpp]

Ich mein die Variable y wird doch schon in diesem Konstruktor initialisiert:
[cpp]Date::Date(int yy, Month mm, int dd) : y(yy), m(mm), d(dd)
</code></pre>
</blockquote>
<p>Die beiden Konstruktoren sind zwei völlig unterschiedliche funktionen, es wird nicht zuerst der eine, dann der andere aufgerufen, sondern genau einer von beiden. (In C++11 kann man auch erreichen, dass der eine Konstruktor den anderen aufruft, aber das passiert auch dort nicht von alleine, sondern nur auf Anweisung des Programmierers)[quote]</p>
<blockquote>
<p>Und wo ist der Sinn hier nochmal return dd; zu schreiben? Wenn ich das weglasse dann funktioniert das Programm auch.</p>
</blockquote>
<p>Über das Ende einer Funktion mit Rückgabewert zu laufen, ohne etwas zurück zu geben, erzeugt (ausgenommen in Funktion main) undefiniertes Verhalten! Mach das nie! Du hast vielleicht gerade Glück, dass in den Registern deiner Maschine gerade noch die richtigen Verweise auf das Objekt stehen, die zu den calling conventions deines Systems passen, aber wenn du auch nur irgendwo die kleinste Kleinigkeit änderst, kann da auch was ganz anderes stehen und wer weiß was passieren. Und wenn du gerade kein Wort von den Registern und conventions verstanden hast, dann zeigt dir das auch, dass da komplizierte Sachen passieren und du einfach nur wahnsinnig Glück hast, dass es funktioniert (oder Pech, da du dadurch diesen klaren Fehler nicht findest). Dein Compiler sollte dich auch davor warnen können, versuch mal rauszufinden, wie man die Compilerwarnungen aktiviert. Dadurch kann man sehr viele Fehler gleich vom Compiler finden lassen, die dieser wegen irgendwelcher Regeln nicht als Fehler nennen darf, die aber fast immer falsch sind. Warnungen sollte man immer angeschaltet haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241813</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Aug 2012 13:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 13:53:22 GMT]]></title><description><![CDATA[<p>Bjarne schrieb:</p>
<blockquote>
<p>2 Frage habe ich noch:</p>
<p>Wo ist der Sinn hier nochmal year() im Konstruktor aufzurufen?</p>
</blockquote>
<p>Ich verstehe deine Fragen nicht wirklich. Bzw. glaube ich das du hier ein Missverständnis hast, was Objekte sind.</p>
<p>Wenn ich ein Date-Objekt erzeuge, hat dies seine eigenen Werte. Sprich die Membervariable y von zwei unterschiedlichen Date-Objekten sind nicht identisch und können unterschiedliche Werte haben.</p>
<pre><code class="language-cpp">...
Date a(2001, jan, 1); // a.y ist 2001
Date b(2003, feb, 2); // b.y ist 2003
...
</code></pre>
<p>Ein Konstruktor dient nun dazu ein Objekt zu initialisieren, und hier holst du dir Standardwerte aus einem anderen Objekt. 'y' ist nicht gleich 'y'.</p>
<p>Bjarne schrieb:</p>
<blockquote>
<p>Und wo ist der Sinn hier nochmal return dd; zu schreiben? Wenn ich das weglasse dann funktioniert das Programm auch.</p>
</blockquote>
<p>Ohne das return kann dein Programm nicht funktionieren, es sei den du hast noch etwas anderes geändert.</p>
<pre><code class="language-cpp">const Date&amp; default_date()
{
    static const Date dd(2001,Date::jan,1);
    //return dd;
}
</code></pre>
<p>Kann nicht kompilieren, oder dein Compiler ist extrem Fehlerhaft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241816</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 14 Aug 2012 13:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 14:01:25 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Kann nicht kompilieren, oder dein Compiler ist extrem Fehlerhaft...</p>
</blockquote>
<p>Welcher Compiler kompiliert das <em>nicht</em>? Dafür müsste der Compiler beweisen können, dass der Programmablauf hier unter gar keinen Umständen korrekt sein kann. Das wäre im Allgemeinen sehr schwierig. Außerdem ist das Programm laut Standard nicht ill-formed, sondern zeigt bloß undefined behaviour.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241823</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Aug 2012 14:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 14:19:13 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Kann nicht kompilieren, oder dein Compiler ist extrem Fehlerhaft...</p>
</blockquote>
<p>Welcher Compiler kompiliert das <em>nicht</em>?</p>
</blockquote>
<p>Okay, sagen wir es anders: Die meisten werden wenigstens eine Warnung (je nach Warnstufe, und die sollte man eher hoch einstellen eher einen Fehler) ausgeben bei einem fehlenden return (oder throw). Das war das erste was mich am C++ Builder aufgeregt hat, das der nur eine Warnung ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241834</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 14 Aug 2012 14:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 14:51:13 GMT]]></title><description><![CDATA[<p>Ich glaub ich hab dank euch meinen Fehler erkannt.</p>
<pre><code class="language-cpp">Date::Date() : y(default_date(). year() )
</code></pre>
<p>Ich merk mir das jetzt so:<br />
default_date() gibt ein Objekt zurück.</p>
<p>Dann habe ich: objekt . year();</p>
<p>year(); gibt einen Wert zurück.</p>
<p>Jetzt habe ich: objekt.wert</p>
<p>y(default_date() . year() ) &lt;-- Der Punkt darin hat mich iritieert</p>
<p>[quote=&quot;SeppJ&quot;]Die beiden Konstruktoren sind zwei völlig unterschiedliche funktionen, es wird nicht zuerst der eine, dann der andere aufgerufen, sondern genau einer von beiden. (In C++11 kann man auch erreichen, dass der eine Konstruktor den anderen aufruft, aber das passiert auch dort nicht von alleine, sondern nur auf Anweisung des Programmierers)</p>
<p>Aber bei mir werden alle Konstruktoren aufgerufen und nicht nur einer von beiden. Ich hab cout&lt;&lt;&quot;ok&quot;; in jeden Konstruktor geschrieben und es wurde jedesmal ausgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241840</guid><dc:creator><![CDATA[Bjarne]]></dc:creator><pubDate>Tue, 14 Aug 2012 14:51:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 15:03:16 GMT]]></title><description><![CDATA[<p>Bjarne schrieb:</p>
<blockquote>
<p>Aber bei mir werden alle Konstruktoren aufgerufen und nicht nur einer von beiden. Ich hab cout&lt;&lt;&quot;ok&quot;; in jeden Konstruktor geschrieben und es wurde jedesmal ausgeben.</p>
</blockquote>
<p>du hast aber auch zwei Instanzen. Jede Instanz wird von genau einem Konstruktor erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241847</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 14 Aug 2012 15:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktor aus Buch Beispiel on Tue, 14 Aug 2012 15:04:18 GMT]]></title><description><![CDATA[<p>Bjarne schrieb:</p>
<blockquote>
<p>Ich glaub ich hab dank euch meinen Fehler erkannt.</p>
</blockquote>
<p>Fast, ein paar Verständnisprobleme hast du noch.</p>
<p>Bjarne schrieb:</p>
<blockquote>
<p>y(default_date() . year() ) &lt;-- Der Punkt darin hat mich iritieert</p>
</blockquote>
<p>Aus diesem Grund hatte ich auch anfangs geschrieben, das ich das Leerzeichen weg lassen würde. Der Punkt bedeutet im wesentlichen das du auf etwas des vorherigen zugreifst (ob dies nun ein Objekt, oder das Ergebnis einer Funktion ist). Für mich stellt dies deshalb eine Einheit dar, das Leerzeichen führt bei mir zu einer optischen Trennung beider Ausdrücke.</p>
<pre><code class="language-cpp">...
Date a(2001,jan,1);
std::cout &lt;&lt; a.year(); // Methode year des Objektes a aufrufen.
...
</code></pre>
<p>Dies ist aber Geschmackssache.</p>
<p>Bjarne schrieb:</p>
<blockquote>
<p>Aber bei mir werden alle Konstruktoren aufgerufen und nicht nur einer von beiden. Ich hab cout&lt;&lt;&quot;ok&quot;; in jeden Konstruktor geschrieben und es wurde jedesmal ausgeben.</p>
</blockquote>
<p>Hieraus ziehst du aber falsche Schlüsse. Wenn du die Methode &quot;default_date&quot; wie im Buch verwendest solltest du mal den Test wie folgt wiederholen: Lege mal anschließend mehrere Objekte an. Du wird im folgenden Code 4 Konstruktoraufrufe sehen:</p>
<pre><code class="language-cpp">...
Date a; // 1 + 2 (Dazu unten mehr)
Date b; // 3
Date c; // 4
...
</code></pre>
<p>Schauen wir uns nochmal die Methode &quot;default_date&quot; an.</p>
<pre><code class="language-cpp">const Date&amp; default_date()
{
    static const Date dd(2001,Date::jan,1);
    return dd;
}
</code></pre>
<p>Was genau geschieht in dieser Methode?</p>
<p>Es wird hier logischerweise auch ein Konstruktor aufgerufen, da &quot;dd&quot; auch ein Date-Objekt ist. Somit hast du beim Erzeugen eines Date-Objektes über den Standardkonstruktor effektiv 2 verschiedene Objekte. Das static bedeutet gleichzeitig das diese Variable nur einmal beim ersten Aufruf erzeugt wird, jeder weitere Aufruf greift auf dieses Objekt zu (es wird erst bei Programmende gelöscht).</p>
<p>Somit wird jeder weitere Aufruf des Standardkonstruktors wiederum nur einen Konstruktoraufruf erzeugen, da &quot;dd&quot; bereits existiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241848</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 14 Aug 2012 15:04:18 GMT</pubDate></item></channel></rss>