<?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[Konstruktor bei C++ (kleine Syntax-Frage)]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich komme aus der Java-Welt und habe eine kleine Frage zur Syntax eines C++ Konsturktors...</p>
<p>Dafür habe ich mir jetzt eine kleine Klasse ausgedacht...<br />
Die <strong>Klasse</strong> soll <strong>Mensch</strong> heißen und hat zwei <strong>Atribute</strong>: <strong>Alter</strong> und <strong>Name</strong>.</p>
<p>Also in Jave würde ein Konstruktor bei mir wie folgt ausschauen:</p>
<pre><code class="language-java">Mensch (int alter, String name) {
this.alter = alter;
this.name = name;
}
</code></pre>
<p>So wenn ich das Ganze jetzt in C++ mache habe ich mir jetzt erst mal folgedes ausgedacht:</p>
<pre><code class="language-cpp">Mensch (int alter, char* name) {
this-&gt;alter = alter;
strcpy(this-&gt;name ,name);
}
</code></pre>
<p>Das ganze scheint auch gut zu funktionieren, doch jetzt gibt es ja bei C++ auch die möglichkeit eine Intitialisierungsliste anzugeben...<br />
Also angenommen ich würde einen Konstrukor mit einer Initialisierungsliste erstlelen wollen der nur das Atribut name setzt, dann würde das ja so aussehen:</p>
<pre><code class="language-cpp">Mensch (int alter)
:alter(alter) {
}
</code></pre>
<p>Da habe ich jetzt auch schon zwei Fragen, wann benutze ich diese Art der Initialisierung? Was ist der tiefere Sinn dahinter und was ist &quot;besser&quot;?<br />
Meine zweite Frage dreht sich um die Namen der Variablen, ich habe es mir bei Java immer angewöhnt beim konstruktor die Übergabeparameter genau so zu nennen wir die Variablen der Klasse (so wie in dem Beispiel).<br />
Im ersten Beispiel habe ich auch kein Problem damit mit &quot;this-&gt;&quot; ist ja auch klar welche Variable immer gemeint ist...<br />
Im zweiten aber kann ich nicht schreiben &quot;this-&gt;alter(alter)&quot; das scheint wohl falsch zu sein, daher meine Frage...<br />
Weiß der Compiler automatisch welche Variable gemeint ist?<br />
In Visual Studio scheint das kein Problem zu sein, doch in NetBeans meckert die Umgebung sagt das geht nicht weil sie nicht verstehen dass die erste Variable die Klassenvariable ist... ):<br />
Also wie macht man das üblicherweise in C++?</p>
<p>Noch etwas, beim Namen scheint das irgendwie mit der Initialisierungsliste nicht zu funktionieren:</p>
<pre><code class="language-cpp">Mensch (char* name)
:name(name) {
}
</code></pre>
<p>auch nicht in dieser Variante:</p>
<pre><code class="language-cpp">Mensch (char* name)
:name(*name) {
}
</code></pre>
<p>Heißt das jetzt bei chars sollte man keine Initialisierungsliste nutzen?<br />
Ich hoffe Jemand kann mir das etwas erklären, sowohl das mit der Syntax und auch das mit der Initialisierungsliste...</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301785/konstruktor-bei-c-kleine-syntax-frage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 18:04:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301785.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Apr 2012 17:13:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 03 Apr 2012 17:13:41 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich komme aus der Java-Welt und habe eine kleine Frage zur Syntax eines C++ Konsturktors...</p>
<p>Dafür habe ich mir jetzt eine kleine Klasse ausgedacht...<br />
Die <strong>Klasse</strong> soll <strong>Mensch</strong> heißen und hat zwei <strong>Atribute</strong>: <strong>Alter</strong> und <strong>Name</strong>.</p>
<p>Also in Jave würde ein Konstruktor bei mir wie folgt ausschauen:</p>
<pre><code class="language-java">Mensch (int alter, String name) {
this.alter = alter;
this.name = name;
}
</code></pre>
<p>So wenn ich das Ganze jetzt in C++ mache habe ich mir jetzt erst mal folgedes ausgedacht:</p>
<pre><code class="language-cpp">Mensch (int alter, char* name) {
this-&gt;alter = alter;
strcpy(this-&gt;name ,name);
}
</code></pre>
<p>Das ganze scheint auch gut zu funktionieren, doch jetzt gibt es ja bei C++ auch die möglichkeit eine Intitialisierungsliste anzugeben...<br />
Also angenommen ich würde einen Konstrukor mit einer Initialisierungsliste erstlelen wollen der nur das Atribut name setzt, dann würde das ja so aussehen:</p>
<pre><code class="language-cpp">Mensch (int alter)
:alter(alter) {
}
</code></pre>
<p>Da habe ich jetzt auch schon zwei Fragen, wann benutze ich diese Art der Initialisierung? Was ist der tiefere Sinn dahinter und was ist &quot;besser&quot;?<br />
Meine zweite Frage dreht sich um die Namen der Variablen, ich habe es mir bei Java immer angewöhnt beim konstruktor die Übergabeparameter genau so zu nennen wir die Variablen der Klasse (so wie in dem Beispiel).<br />
Im ersten Beispiel habe ich auch kein Problem damit mit &quot;this-&gt;&quot; ist ja auch klar welche Variable immer gemeint ist...<br />
Im zweiten aber kann ich nicht schreiben &quot;this-&gt;alter(alter)&quot; das scheint wohl falsch zu sein, daher meine Frage...<br />
Weiß der Compiler automatisch welche Variable gemeint ist?<br />
In Visual Studio scheint das kein Problem zu sein, doch in NetBeans meckert die Umgebung sagt das geht nicht weil sie nicht verstehen dass die erste Variable die Klassenvariable ist... ):<br />
Also wie macht man das üblicherweise in C++?</p>
<p>Noch etwas, beim Namen scheint das irgendwie mit der Initialisierungsliste nicht zu funktionieren:</p>
<pre><code class="language-cpp">Mensch (char* name)
:name(name) {
}
</code></pre>
<p>auch nicht in dieser Variante:</p>
<pre><code class="language-cpp">Mensch (char* name)
:name(*name) {
}
</code></pre>
<p>Heißt das jetzt bei chars sollte man keine Initialisierungsliste nutzen?<br />
Ich hoffe Jemand kann mir das etwas erklären, sowohl das mit der Syntax und auch das mit der Initialisierungsliste...</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198430</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Tue, 03 Apr 2012 17:13:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 03 Apr 2012 17:24:57 GMT]]></title><description><![CDATA[<p>Der Vorteil einer Initialisierungsliste ist der, dass du mit ihr deine Membervariablen einen Initialisierungswert geben kannst.<br />
Wenn du im Konstruktorrumpf deinen Membervariablen einen Wert zuweist ist das nur eine Zuweisung und KEINE Initialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198436</guid><dc:creator><![CDATA[_Lyie]]></dc:creator><pubDate>Tue, 03 Apr 2012 17:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 03 Apr 2012 17:39:35 GMT]]></title><description><![CDATA[<p>Letztens hat einer das Gleiche gefragt:<br />
<a href="http://www.c-plusplus.net/forum/301712" rel="nofollow">http://www.c-plusplus.net/forum/301712</a></p>
<p>Außerdem ist char* hier unötig, benutzt lieber std::string.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

class foo
{
    public:
        foo(std::string&amp; _bar) : bar(_bar) {}

    private:
        std::string bar;
};

int main()
{
    foo(&quot;hallo&quot;);
}
</code></pre>
<p>Hast du ein bestimmtes Buch um C++ zu lernen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198440</guid><dc:creator><![CDATA[Jan++ 0]]></dc:creator><pubDate>Tue, 03 Apr 2012 17:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 03 Apr 2012 17:49:47 GMT]]></title><description><![CDATA[<p>Ah okay, vielen Dank für die Info und den Link!</p>
<p>Ich weiß jetzt das man Initialisierungslisten nutzen sollte,<br />
doch was genau ist daran schlecht wenn man nicht sofort initialisiert?</p>
<p>Nein ich habe kein Buch, ich wollte mir erst mal bisschen C++ anschauen und dann später mir ein Buch besorgen...</p>
<p>Aber noch zu meiner Syntax-Frage, gibt es da einen guten &quot;Programmeirstiel&quot; wie man das machen sollte?</p>
<p>Also folgendes Beispiel...</p>
<p>Ich würde meinen Konstruktor so schreiben:</p>
<pre><code class="language-cpp">Mensch (string&amp; name, int alter)
: name(name), alter(alter) {
}
</code></pre>
<p>Der funktioniert auch so in Visual Studio, doch in NetBeans z.B. nicht...<br />
Da müsste ich dann sowas hier machen damit er geht:</p>
<pre><code class="language-cpp">Mensch (string&amp; _name, int _alter)
: name(_name), alter(_alter) {
}
</code></pre>
<p>Wie sollte man es machen?<br />
Ist die erste Variante &quot;unüblich&quot; bei C++?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198447</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Tue, 03 Apr 2012 17:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 03 Apr 2012 17:59:35 GMT]]></title><description><![CDATA[<p>Alle modernen Compiler sollten das richtig auflösen, auch wenn Parameter und Member hier den gleichen Namen haben. (Im Funktionskörper selbst geht das natürlich nicht mehr, da müsstest du im Notfall über this-&gt; zugreifen.)</p>
<p>Die Vorteil der Initialisierungsliste ist, dass man damit eben initialisiert und nicht zuweist. Das mag trivial klingen (und für Integer etc. ist es das auch meistens), ist es aber nicht immer. Angenommen du hast als Member ein Objekt einer Klasse ohne default Konstruktor. Ohne das Objekt vernünftig zu initialieren kannst du das nicht kompilieren.<br />
Zudem kann eine direkte Initialisierung auch schneller sein, als eine Default-Initialisierung gefolgt von einer Zuweisung. (z.B. nur eine Speicheranforderung statt zwei etc. pp.)<br />
Abgesehen davon ist es hübscher. <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>
<p>Du solltest dir weiterhin angewöhnen auf die &quot;const correctness&quot; zu achten. Wenn du einen Pointer oder eine Referenz auf etwas erwartest, weiß der Aufrufer ja nicht, ob du das veränderst. Wenn du es also nicht verändest (nur liest), solltest du eine const&amp;/const* erwarten.</p>
<p>Also z.B. const char* (pointer to const char) bzw. const std::string&amp; (reference to const std::string).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198449</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 03 Apr 2012 17:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 01 May 2012 06:19:30 GMT]]></title><description><![CDATA[<p>vandread schrieb:</p>
<blockquote>
<p>wann benutze ich diese Art der Initialisierung?</p>
</blockquote>
<p>Die Initialisierungsliste solltest du, falls möglich, immer verwenden. Bei folgenden Dingen musst du sie sogar zwingend verwenden, sonst bekommst du einen Compilerfehler:<br />
-const-qualifizierte Member<br />
-Referenzen<br />
-Member ohne Default-Konstruktor<br />
-Wenn die Basisklasse keinen Default-Konstruktor hat.</p>
<p>vandread schrieb:</p>
<blockquote>
<p>Was ist der tiefere Sinn dahinter und was ist &quot;besser&quot;?</p>
</blockquote>
<p>Besser daran ist, wie es der Name schon sagt, dass eine Initialisierungsliste die Member initialisiert, du also nur einen Methodenaufruf brauchst. Ohne Initialisierungsliste hast du 2 Methodenaufrufe, nämlich einen für die Definition und einen für die Zuweisung, was ziemlich doof ist. Hier mal ein sehr einfaches Beispielprogramm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
class foo
{
	public:
		foo() 
		{
			std::cout &lt;&lt; &quot;Definition&quot; &lt;&lt; '\n';
		}
		foo(int i) 
		{
			std::cout &lt;&lt; &quot;Initialisierung&quot; &lt;&lt; '\n';
		}
		void operator=(int i)
		{
			std::cout &lt;&lt; &quot;Zuweisung&quot; &lt;&lt; '\n';
		}
};
class Mensch
{
    private:
        foo f_1;
        foo f_2;
	public:
		Mensch() : f_1(7)
		{
			f_2 = 7;
		}
};
int main()
{
    Mensch m;
    return 0;
}
</code></pre>
<p>Wie du siehst, bekommst du bei <code>f_2</code> zwei Ausgaben, für <code>f_1</code> nur eine.</p>
<p>vandread schrieb:</p>
<blockquote>
<p>ich habe es mir bei Java immer angewöhnt beim konstruktor die Übergabeparameter genau so zu nennen wir die Variablen der Klasse (so wie in dem Beispiel). Im zweiten aber kann ich nicht schreiben &quot;this-&gt;alter(alter)&quot; das scheint wohl falsch zu sein, daher meine Frage... Weiß der Compiler automatisch welche Variable gemeint ist?</p>
</blockquote>
<p>Ja, weiß er, und zwar einfach aus dem Grund, dass die Initialisierungsliste ausschließlich Member der eigenen Klasse initialisieren kann. Und damit ist auch klar, welche Variable die Membervariable und welche der Parameter ist. (siehe auch <a href="http://www.c-plusplus.net/forum/302911" rel="nofollow">http://www.c-plusplus.net/forum/302911</a>)<br />
Gemacht wird es also ganz genau so, wie du es hast:</p>
<pre><code class="language-cpp">Mensch(int alter) : alter(alter) {}
</code></pre>
<p>vandread schrieb:</p>
<blockquote>
<p>Noch etwas, beim Namen scheint das irgendwie mit der Initialisierungsliste nicht zu funktionieren:</p>
<pre><code class="language-cpp">Mensch (char* name) : name(name) {}
</code></pre>
</blockquote>
<p>Am Besten vergisst du das ganz schnell wieder und machst es auf die C++ Art:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
class Mensch
{
	private:
		std::string name;
	public:
		Mensch(const std::string&amp; name) : name(name) {}
};
int main()
{
	Mensch m(&quot;Max&quot;);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2198453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198453</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 01 May 2012 06:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Tue, 03 Apr 2012 18:11:49 GMT]]></title><description><![CDATA[<p>Alles klar (:<br />
Vielen Dank Leute!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198454</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Tue, 03 Apr 2012 18:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor bei C++ (kleine Syntax-Frage) on Wed, 04 Apr 2012 07:35:20 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>vandread schrieb:</p>
<blockquote>
<p>Noch etwas, beim Namen scheint das irgendwie mit der Initialisierungsliste nicht zu funktionieren:</p>
<pre><code class="language-cpp">Mensch (char* name) : name(name) {}
</code></pre>
</blockquote>
<p>Am Besten vergisst du das ganz schnell wieder und machst es auf die C++ Art:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
class Mensch
{
	private:
		std::string name;
	public:
		Mensch(const std::string&amp; name) : name(name) {}
};
int main()
{
	Mensch m(&quot;Max&quot;);
	return 0;
}
</code></pre>
</blockquote>
<p>oder auf die &quot;C++11 Art&quot; mit etwas mehr pass-by-value, falls sinnvoll:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;utility&gt;

class Mensch
{
    std::string name;
public:
    Mensch(std::string name)
    : name(std::move(name))
    {}
};
</code></pre>
<p>(-:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198567</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 04 Apr 2012 07:35:20 GMT</pubDate></item></channel></rss>