<?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 Klassen]]></title><description><![CDATA[<p>Hi ich habe jetzt im Internet ein paar Sachen über klassen gelesen und wollte mal fragen ob ich das jetzt alles mit Konstruktor usw. richtig verstanden habe.</p>
<pre><code class="language-cpp">class dog
{
private: 
	int age;
	string name;
public:
	dog(int newAge = 0, string newName = &quot;dog&quot;)
	{
		age = newAge;
		name = newName;
	}
	~dog
	{
		age = 0;
		name = &quot;&quot;;
	}
	void SetAge(int newAge)
	{
		age = newAge;
	}
	int getAge(void)
	{
		return age;
	}
	void setName(string newName)
	{
		name = newName;
	}
	string getName(void)
	{
		return name;
	}
};
</code></pre>
<p>Ist der Konstruktor hier richtig verwendet? Habe es nämlich auch schon anderes gesehen, dort wurde es irgendwie so gemacht:</p>
<pre><code class="language-cpp">dog(bla bla): age = 0
{

}
</code></pre>
<p>order so ähnlich ^^</p>
<p>Was davon ist richtig? Oder kann man beides benutzten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268169/frage-zu-klassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 00:14:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268169.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Jun 2010 10:56:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 10:56:33 GMT]]></title><description><![CDATA[<p>Hi ich habe jetzt im Internet ein paar Sachen über klassen gelesen und wollte mal fragen ob ich das jetzt alles mit Konstruktor usw. richtig verstanden habe.</p>
<pre><code class="language-cpp">class dog
{
private: 
	int age;
	string name;
public:
	dog(int newAge = 0, string newName = &quot;dog&quot;)
	{
		age = newAge;
		name = newName;
	}
	~dog
	{
		age = 0;
		name = &quot;&quot;;
	}
	void SetAge(int newAge)
	{
		age = newAge;
	}
	int getAge(void)
	{
		return age;
	}
	void setName(string newName)
	{
		name = newName;
	}
	string getName(void)
	{
		return name;
	}
};
</code></pre>
<p>Ist der Konstruktor hier richtig verwendet? Habe es nämlich auch schon anderes gesehen, dort wurde es irgendwie so gemacht:</p>
<pre><code class="language-cpp">dog(bla bla): age = 0
{

}
</code></pre>
<p>order so ähnlich ^^</p>
<p>Was davon ist richtig? Oder kann man beides benutzten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907225</guid><dc:creator><![CDATA[wurstuk]]></dc:creator><pubDate>Sat, 05 Jun 2010 10:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 11:05:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">dog(int newAge, string newName)
{
  age = newAge;
  name = newName;
}
</code></pre>
<p>Hier wird name zunächst mit dem Standardkonstruktor initialisiert, also ein leerer string und age mit nichts initialisiert, hat irgendeinen undefinierten Wert. Im Rumpf des ctors werden dann Werte zugewiesen.</p>
<pre><code class="language-cpp">dog(int newAge, string newName)
: age(newAge), name(newName)
{
}
</code></pre>
<p>Hier wird age direkt mit dem Wert newAge initialisiert und für name der Kopierkonstruktor aufgerufen. (Bei neueren Compilern evtl. auch der &quot;Move-konstruktor&quot;)</p>
<pre><code class="language-cpp">dog(int newAge, const string&amp; newName)
: age(newAge), name(newName)
{
}
</code></pre>
<p>dito, spart aber das Kopieren des Arguments newName.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907230</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 05 Jun 2010 11:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 11:14:30 GMT]]></title><description><![CDATA[<p>also geht das was ich oben geschrtieben habe nicht?</p>
<p>Hab mir das so gedacht das wenn mann halt nichts besonderes angibt das Objekt die werte 0 und dog bekommt, und das das funktioniert auch wunderbar, aber ist das falsch wie ich es gemacht habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907236</guid><dc:creator><![CDATA[wurstuk]]></dc:creator><pubDate>Sat, 05 Jun 2010 11:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 11:19:00 GMT]]></title><description><![CDATA[<p>Nicht falsch, aber schlecht. Die Defaultwerte sind schon okay, aber du solltest auf jeden Fall die Initialisierungsliste verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907239</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 05 Jun 2010 11:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 11:20:37 GMT]]></title><description><![CDATA[<p>ok dann hab ich noch eine frage wozu sind dann die {} bei dem Konstruktor?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907242</guid><dc:creator><![CDATA[wurstuk]]></dc:creator><pubDate>Sat, 05 Jun 2010 11:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 11:24:02 GMT]]></title><description><![CDATA[<p>Falsch ist das nicht, blos nicht besonders effektiv, weil du da wie erklärt mehr Aufrufe hast. Das hinter dem Doppelpunkt nennt sich Initialisierungsliste und sollte man immer benutzen. An manchen Stellen wird sie sogar zwingend notwendig, nämlich wenn Basisklassen oder Member über keinen Standardkostruktor verfügen.</p>
<p>Der Rumpf deines Destruktors ist auch nicht falsch aber vollkommen sinnlos. Das kann einfach weg.<br />
Und dann kannst du dir auch nochmal das Thema &quot;Referenzen&quot; ansehen. Objekte wie <code>string</code> sollte man fast immer als <code>const string&amp;</code> übergeben. Genauso kannst du besser schreiben:</p>
<pre><code class="language-cpp">const std::string&amp; getName(void)const
{
  return name;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1907244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907244</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 05 Jun 2010 11:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 11:24:49 GMT]]></title><description><![CDATA[<p>wurstuk schrieb:</p>
<blockquote>
<p>ok dann hab ich noch eine frage wozu sind dann die {} bei dem Konstruktor?^^</p>
</blockquote>
<p>Jede Funktion, die man aufrufen möchte braucht einen Funktionsrumpf. Auch wenn da nichts drinsteht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907246</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 05 Jun 2010 11:24:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 12:01:04 GMT]]></title><description><![CDATA[<p>OK danke^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907266</guid><dc:creator><![CDATA[wurstuk]]></dc:creator><pubDate>Sat, 05 Jun 2010 12:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 12:11:42 GMT]]></title><description><![CDATA[<p>wurstuk schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class dog
{
private: 
	int age;
	string name;
public:
	dog(int newAge = 0, string newName = &quot;dog&quot;)
	{
		age = newAge;
		name = newName;
	}
</code></pre>
</blockquote>
<p>Falsch ist das nicht. Aber auch nicht besonders gut. Besser:</p>
<pre><code class="language-cpp">explicit dog(int newAge=0, string newName=&quot;dog&quot;)
: age(newAge)
{
  name.swap(newName);
}
</code></pre>
<p>Mit <code>explicit</code> wird hier verhindert, dass ein <code>int</code> versehentlich in ein <code>dog</code> konvertiert werden kann. <code>:age(newAge)</code> ist die Initialisierungssyntax. Ich habe hier aber <code>name</code> absichtlich außen vor gelassen. Deswegen wird das Subobjekt <code>name</code> default-konstruiert. Später vertausche ich den Inhalt zwischen <code>name</code> und dem Parameter <code>newName</code> . Das geht bei <code>string</code> typischerweise flotter als Kopieren/Zuweisen.</p>
<p>wurstuk schrieb:</p>
<blockquote>
<pre><code class="language-cpp">~dog
	{
		age = 0;
		name = &quot;&quot;;
	}
</code></pre>
</blockquote>
<p>Dieser Destruktor erfüllt keinen Zweck. Du kannst ihn weglassen.</p>
<p>wurstuk schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int getAge(void)
	{
		return age;
	}
</code></pre>
</blockquote>
<p>Das <code>void</code> in den Klammern ist bei C++ überflüssig. Du kannst es weglassen. Da diese Funktion den logischen Zustand des Objekts nicht verändern will/soll, kannst Du das mit einem zusätzlichen <code>const</code> kennzeichnen:</p>
<pre><code class="language-cpp">int getAge() const
{ return age; }
</code></pre>
<p>Es lohnt sich, so etwas konsequent durchzuziehen. Das gilt auch für Deine getName-Funktion.</p>
<p>wurstuk schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void setName(string newName)
	{
		name = newName;
	}
</code></pre>
</blockquote>
<p>Hier könntest Du aus newName noch eine Referenz machen:</p>
<pre><code class="language-cpp">void setName(string const&amp; newName)
{ name = newName; }
</code></pre>
<p>Das Kopieren von <code>string</code> -Objekten, sowie andere Standardcontainer kostet etwas Zeit. Da Du newName nicht als Kopie des Arguments brauchst und nur lesend auf das Quell-Objekt zugreifen willst, kann man auch einfach eine ref-auf-const benutzen. Der Aufruf der setName-Funktion sieht aber immer noch genauso aus. So kann man u.U. unnötige Kopien vermeiden. Bei anderen Typen (int, double, etc) lohnt sich so etwas allerdings nicht.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907277</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 05 Jun 2010 12:11:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen on Sat, 05 Jun 2010 12:14:33 GMT]]></title><description><![CDATA[<p>OK vielen Danke! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907279</guid><dc:creator><![CDATA[wurstuk]]></dc:creator><pubDate>Sat, 05 Jun 2010 12:14:33 GMT</pubDate></item></channel></rss>