<?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[Fragen zu Konstruktoren]]></title><description><![CDATA[<p>Hallo!<br />
Ich spiele gerade etwas damit rum, um zu lernen und zu verstehen ...<br />
Nur verstehen tu ich das leider nicht so ganz.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

class Klasse
{
public:
	Klasse() : Wert(&quot;&quot;) { cout &lt;&lt; &quot;Standardkonstruktor\n&quot;; }
	Klasse(const Klasse&amp; tmpcl) : Wert(tmpcl.GetWert()) { cout &lt;&lt; &quot;Kopierkonstruktor\n&quot;; }
	Klasse(const string&amp; neu) : Wert(neu) { cout &lt;&lt; &quot;Typumwandlungskonstruktor\n&quot;; }
	const string&amp; GetWert() const;
	void SetWert(const string&amp;);
private:
	string Wert;
};

int main()
{
	Klasse MyString;
	MyString.SetWert(&quot;Hallo!&quot;);
	cout &lt;&lt; &quot;MyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	Klasse MyString2 = MyString;
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	MyString2.SetWert(&quot;bla&quot;);
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	MyString = MyString2;
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	MyString = string(&quot;neu&quot;);
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	return 0;
}

const string&amp; Klasse::GetWert() const
{
	return Wert;
}

void Klasse::SetWert(const string&amp; newWert)
{
	Wert = newWert;
}
</code></pre>
<p>Der Code funktioniert so.<br />
Soweit so gut. Nur verstehe ich folgende Dinge nicht:</p>
<p>1. Wie oder mit welchem Konstruktor ist es moeglich das <code>MyString.GetWert();</code> in Zeile 22 wegzulassen, um einfach nur <code>MyString</code> zu schreiben (sodass der Wert 'Wert' einfach zurueckgegeben wird ohne die Methode <code>GetWert()</code> ).</p>
<p>2. Warum ergibt <code>MyString = &quot;neu&quot;</code> in Zeile 33 einen Compilerfehler? Warum muss hier unbedingt <code>MyString = string(&quot;neu&quot;)</code> oder <code>MyString = Klasse(&quot;neu&quot;)</code> stehen? Sollte die Zeichenfolge nicht automatisch zum String konvertiert werden? Ich hab doch gar kein <code>explicit</code> angegeben ...</p>
<p>3. Warum wird der Kopierkonstruktor nur bei <code>Klasse MyString2 = MyString;</code> ausgefuehrt. Sollte er nicht auch z.b. bei <code>MyString = MyString2;</code> ausgefuehrt werden?</p>
<p>Weitere Fragen folgen .... ich versteh so manches nich ... leider <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gruss<br />
Cartman</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233370/fragen-zu-konstruktoren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 23:21:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233370.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Feb 2009 20:47:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 20:47:47 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich spiele gerade etwas damit rum, um zu lernen und zu verstehen ...<br />
Nur verstehen tu ich das leider nicht so ganz.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

class Klasse
{
public:
	Klasse() : Wert(&quot;&quot;) { cout &lt;&lt; &quot;Standardkonstruktor\n&quot;; }
	Klasse(const Klasse&amp; tmpcl) : Wert(tmpcl.GetWert()) { cout &lt;&lt; &quot;Kopierkonstruktor\n&quot;; }
	Klasse(const string&amp; neu) : Wert(neu) { cout &lt;&lt; &quot;Typumwandlungskonstruktor\n&quot;; }
	const string&amp; GetWert() const;
	void SetWert(const string&amp;);
private:
	string Wert;
};

int main()
{
	Klasse MyString;
	MyString.SetWert(&quot;Hallo!&quot;);
	cout &lt;&lt; &quot;MyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	Klasse MyString2 = MyString;
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	MyString2.SetWert(&quot;bla&quot;);
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	MyString = MyString2;
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	MyString = string(&quot;neu&quot;);
	cout &lt;&lt; &quot;MyString2: &quot; &lt;&lt; MyString2.GetWert() &lt;&lt; &quot;\tMyString: &quot; &lt;&lt; MyString.GetWert() &lt;&lt; endl;
	cin.get();
	return 0;
}

const string&amp; Klasse::GetWert() const
{
	return Wert;
}

void Klasse::SetWert(const string&amp; newWert)
{
	Wert = newWert;
}
</code></pre>
<p>Der Code funktioniert so.<br />
Soweit so gut. Nur verstehe ich folgende Dinge nicht:</p>
<p>1. Wie oder mit welchem Konstruktor ist es moeglich das <code>MyString.GetWert();</code> in Zeile 22 wegzulassen, um einfach nur <code>MyString</code> zu schreiben (sodass der Wert 'Wert' einfach zurueckgegeben wird ohne die Methode <code>GetWert()</code> ).</p>
<p>2. Warum ergibt <code>MyString = &quot;neu&quot;</code> in Zeile 33 einen Compilerfehler? Warum muss hier unbedingt <code>MyString = string(&quot;neu&quot;)</code> oder <code>MyString = Klasse(&quot;neu&quot;)</code> stehen? Sollte die Zeichenfolge nicht automatisch zum String konvertiert werden? Ich hab doch gar kein <code>explicit</code> angegeben ...</p>
<p>3. Warum wird der Kopierkonstruktor nur bei <code>Klasse MyString2 = MyString;</code> ausgefuehrt. Sollte er nicht auch z.b. bei <code>MyString = MyString2;</code> ausgefuehrt werden?</p>
<p>Weitere Fragen folgen .... ich versteh so manches nich ... leider <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gruss<br />
Cartman</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657554</guid><dc:creator><![CDATA[Eric Cartman]]></dc:creator><pubDate>Tue, 03 Feb 2009 20:47:47 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 21:00:31 GMT]]></title><description><![CDATA[<p>1. Gar nicht. Man könnte da etwas mit dem () basteln, macht imo aber nicht viel Sinn.</p>
<p>2. Das ist keine Initialisierung, sondern eine Zuweisung. Das ist ein essentieller Unterschied. (siehe =-Operator).</p>
<p>3. Dasselbe Problem, wie bei 2. Es wird der =-Operator (Zuweisungsoperator) aufgerufen, nicht der Konstruktor. (Ist ja bereits Initialisiert).</p>
<p>EDIT:<br />
Schreibfehler korrigiert.<br />
Achja..Schau dir mal &quot;die grossen 3&quot; an:<br />
<a href="http://www.google.ch/search?q=die+grossen+3+c%2B%2B&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:de:official&amp;client=firefox-a" rel="nofollow">http://www.google.ch/search?q=die+grossen+3+c%2B%2B&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f1e9-1f1ea.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--germany"
      title=":de:"
      alt="🇩🇪"
    />official&amp;client=firefox-a</a></p>
<p>Dann sollte dir einiges klarer werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657558</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 21:06:58 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>1. Gar nicht. Man könnte da etwas mit dem () basteln, macht imo aber nicht viel Sinn.</p>
</blockquote>
<p>Das stimmt so nicht. Für diesen Zweck gibt es Konvertierungsoperatoren.</p>
<pre><code class="language-cpp">Klasse::operator const std::string&amp; () const
{
    return Wert;
}

// ...
std::cout &lt;&lt; MyString &lt;&lt; std::endl; // implizite Konvertierung nach std::string
</code></pre>
<p><em>Edit: <code>const</code> bei Operator</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657562</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 21:27:06 GMT]]></title><description><![CDATA[<p>Ich versuch mal kurz zu antworten:</p>
<p>1.) Durch keinen Konstruktor. Was du machen müsstest, ist einen Cast-Operator zu schreiben.</p>
<p>2.) Compiler-Fehler, da du keinen Assignment-Operator von Klasse für std::string oder const char* implementiert hast.</p>
<p>3.) Nein, weil MyString = MyString2 eine Zuweisung ist (wo beide Objekte vorher existieren), während bei Klasse MyString2 = MyString MyString2 erst erzeugt wird. Ist gleichbedeutend mit Klasse MyString2(MyString).</p>
<p>HTH</p>
<p>Edit: zu 1.) Es gibt noch zusätzlich die Möglichkeit, die ostream-operatoren zu überladen für deine Klasse</p>
<pre><code class="language-cpp">std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Klasse&amp;)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1657563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657563</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 21:31:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>1. Gar nicht. Man könnte da etwas mit dem () basteln, macht imo aber nicht viel Sinn.</p>
</blockquote>
<p>Das stimmt so nicht. Für diesen Zweck gibt es Konvertierungsoperatoren.</p>
</blockquote>
<p>Stimmt. Ich habe das Beispiel nur schnell überflogen und hatte im Kopf, dass er einen Rückgabewert von Konstruktor haben will. Er hat ja noch nach Konstruktor gefragt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657579</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:31:14 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 21:48:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>1. Gar nicht. Man könnte da etwas mit dem () basteln, macht imo aber nicht viel Sinn.</p>
</blockquote>
<p>Das stimmt so nicht. Für diesen Zweck gibt es Konvertierungsoperatoren.</p>
<pre><code class="language-cpp">Klasse::operator const std::string&amp; () const
{
    return Wert;
}

// ...
std::cout &lt;&lt; MyString &lt;&lt; std::endl; // implizite Konvertierung nach std::string
</code></pre>
<p><em>Edit: <code>const</code> bei Operator</em></p>
</blockquote>
<p>Muss man da noch irgendwas im Klassenkopf deklarieren? Weil so funktioniert das nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Den Rest habe ich verstanden denk ich <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>Danke fuer eure Antworten!</p>
<p>Gruss<br />
Cartman</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657591</guid><dc:creator><![CDATA[Eric Cartman]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 21:51:09 GMT]]></title><description><![CDATA[<p>Jap. Deklaration gehört in die Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657592</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Konstruktoren on Tue, 03 Feb 2009 22:04:56 GMT]]></title><description><![CDATA[<p>Eric Cartman schrieb:</p>
<blockquote>
<p>Muss man da noch irgendwas im Klassenkopf deklarieren? Weil so funktioniert das nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Ja, der Cast-Operator ist eigentlich eine normale Memberfunktion. Also muss eine Deklaration mit gleicher Signatur in der Klassendefinition erfolgen.</p>
<p>Mit Konvertierungsoperatoren solltest du allerdings vorsichtig sein: Die Klasse kann so nämlich als String betrachtet werden. Vielleicht gibt es Situationen, wo die implizite Konvertierung nicht erwünscht ist oder sogar zu Konflikten führt; in diesen Fällen ist eine herkömmliche Get-Methode besser geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657601</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 03 Feb 2009 22:04:56 GMT</pubDate></item></channel></rss>