<?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[Unterschied zwischen Typendeklaration = und ()]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutzt C++ mit dem Gnu Compiler und Code::Blocks.</p>
<p>Was ist der Unterschied bei den Typendeklarationen mit Wertzuweisung zwischen '=' und den Klammern?</p>
<p>int zahl1 = 123; // und<br />
int zahl2 (123);</p>
<p>oder</p>
<p>string str1 = &quot;abc&quot;; // und<br />
string str2 (&quot;abc&quot;);</p>
<p>Das Resultat bei Ausgabe mit cout ist ja dasgleiche.</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304837/unterschied-zwischen-typendeklaration-und</link><generator>RSS for Node</generator><lastBuildDate>Sat, 27 Jun 2026 02:16:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304837.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Jun 2012 09:40:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 09:40:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutzt C++ mit dem Gnu Compiler und Code::Blocks.</p>
<p>Was ist der Unterschied bei den Typendeklarationen mit Wertzuweisung zwischen '=' und den Klammern?</p>
<p>int zahl1 = 123; // und<br />
int zahl2 (123);</p>
<p>oder</p>
<p>string str1 = &quot;abc&quot;; // und<br />
string str2 (&quot;abc&quot;);</p>
<p>Das Resultat bei Ausgabe mit cout ist ja dasgleiche.</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223450</guid><dc:creator><![CDATA[minotaurus]]></dc:creator><pubDate>Fri, 15 Jun 2012 09:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 15:03:44 GMT]]></title><description><![CDATA[<p>Nicht für jeden Typen macht es einen Unterschied, aber für einige. Die erste Syntax mit dem Gleichzeichen nennt sich Kopierinitialisierung</p>
<pre><code class="language-cpp">T x = soundso; // copy initialization
</code></pre>
<p>Die zweite Syntax mit den Klammern nennt sich Direktinitialisierung</p>
<pre><code class="language-cpp">T x (soundso); // direct initialization
</code></pre>
<p>Die Kopierinitialisierung ist auch die, die bei der Parameterübergabe oder Rückgabe eines Funktionswertes stattfindet.</p>
<p>Schau mal, was es für einen Unterschied bei expliziten Konstruktoren macht:</p>
<pre><code class="language-cpp">vector&lt;double&gt; x = 2; // kompiliert nicht! Keine implizite Konvertierung
vector&lt;double&gt; y (2); // OK, y.size()==2
</code></pre>
<p><code>int</code> ist nicht implizit zu <code>vector&lt;double&gt;</code> konvertierbar. Also funktioniert das hier mit der Kopierinitialisierung nicht. <code>vector&lt;double&gt;</code> besitzt aber einen mit <code>explicit</code> markierten Konstruktor, der eine Ganzzahl entgegen nimmt, die die Größe des zu erstellenden Vektors steuert. Die Klammersyntax ist quasi der direkte Aufruf dieses Konstruktors. Konstruktoren, die mit einem Parameter aufrufbar sind, aber nicht <code>explicit</code> sind, nennt man auch Konvertierungskonstruktor (Kopier/Move-Konstruktoren mal ausgenommen). So einen Konvertierungskonstruktor bietet std::vector&lt;&gt; nur für initialiter_list&lt;&gt; an, so dass du sowohl</p>
<pre><code class="language-cpp">vector&lt;double&gt; v = {3.142, 2.718, 1.618}; // copy list initialization
</code></pre>
<p>als auch</p>
<pre><code class="language-cpp">vector&lt;double&gt; w {3.142, 2.718, 1.618}; // direct list initialization
</code></pre>
<p>schreiben kannst (in C++2011).</p>
<p>Der wesentliche Unterschied hier ist, dass für Kopierinitialisierung nur implizite und keine expliziten Konstruktoren in Frage kommen und dass der Typ kopierbar oder &quot;movebar&quot; sein muss (auch wenn die Verwendung eines solchen Konstruktors bei der Initialisierung wegoptimiert werden könnte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223453</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Jun 2012 15:03:44 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 13:28:42 GMT]]></title><description><![CDATA[<p>Hallo und danke mal für die Antwort.</p>
<p>So wie ich es verstanden habe, gibt es bei expliziten Konstruktoren keine Möglichkeit der Kopierinitialisation.</p>
<p>Bei einfachen Typen, wie INT, CHAR, STRING ist beides möglich.</p>
<p>So scheint die Direktinitialisierung bspw. 'INT x (12345);' allgemein der Kopierinitialisierung vorzuziehen zu sein.</p>
<p>Gibt es bei der Direktinitialisierung einen Nachteil (Codelänge, Laufzeit) ?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223556</guid><dc:creator><![CDATA[minotaurus]]></dc:creator><pubDate>Fri, 15 Jun 2012 13:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 13:35:32 GMT]]></title><description><![CDATA[<p>minotaurus schrieb:</p>
<blockquote>
<p>Bei einfachen Typen, wie INT, CHAR, STRING ist beides möglich.</p>
</blockquote>
<p>Ich würde nicht sagen, dass std::string ein &quot;einfacher&quot; ist. Kommt aber drauf an, was du damit meinst. <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>std::string bietet zumindest einen Konvertierungskonstruktor an, der einen <code>const char*</code> -Wert entgegen nimmt. Deswegen sind beide Initialisierungen möglich (copy und direct).</p>
<p>minotaurus schrieb:</p>
<blockquote>
<p>Gibt es bei der Direktinitialisierung einen Nachteil (Codelänge, Laufzeit)?</p>
</blockquote>
<p>Nö. Aber auch keinen wirklichen Vorteil, falls beide Initialisierungen zulässig sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223557</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Jun 2012 13:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 14:52:51 GMT]]></title><description><![CDATA[<p>Ok - danke !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223594</guid><dc:creator><![CDATA[minotaurus]]></dc:creator><pubDate>Fri, 15 Jun 2012 14:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 15:09:21 GMT]]></title><description><![CDATA[<p>minotaurus schrieb:</p>
<blockquote>
<p>So scheint die Direktinitialisierung bspw. 'INT x (12345);' allgemein der Kopierinitialisierung vorzuziehen zu sein.</p>
</blockquote>
<p>Wieso das denn?! Ich sehe nicht, wie du darauf gekommen bist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223607</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Jun 2012 15:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 17:13:15 GMT]]></title><description><![CDATA[<p>minotaurus schrieb:</p>
<blockquote>
<p>Gibt es bei der Direktinitialisierung einen Nachteil (Codelänge, Laufzeit) ?</p>
</blockquote>
<p>Codelängen und Laufzeitmäßig nicht. Rein theoretisch muss der Copy-Ctor für Copy-Initialization vorhanden zu erreichbar sein, damit das erlaubt ist. De facto wird er dann aber nicht aufgerufen, weil wegoptimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223669</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 15 Jun 2012 17:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Fri, 15 Jun 2012 17:57:03 GMT]]></title><description><![CDATA[<p>Also wenn ich das jetzt richtig verstanden hab, wird hier</p>
<pre><code class="language-cpp">struct Zahl
{
    int wert;
    Zahl(int x) : wert(x) {}
};

//...

Zahl z = 3;
</code></pre>
<p>Zahl z = 3 zu Zahl z(Zahl(3)) und dann wird implizit der jeweilige (automatisch generierte) Kopierkonstruktor aufgerufen?</p>
<p>EDIT: Und explicit verhindert genau das eben, so als würde der Kopierkonstruktor private werden? Und was soll das bringen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223684</guid><dc:creator><![CDATA[Incocnito]]></dc:creator><pubDate>Fri, 15 Jun 2012 17:57:03 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Mon, 18 Jun 2012 15:01:25 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28589">@minotaurus</a><br />
Typendeklarationen ist in dem Zusammenhang Quatsch. Das wovon du redest ist eine Variablendefinition.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25153">@Incocnito</a><br />
Was soll was bringen?<br />
Und nö, mit &quot;so als würde der Kopierkonstruktor private werden&quot; kann man das nicht beschreiben.<br />
<code>explicit</code> verbietet dass ein Konstruktor implizit aufgerufen wird. Also an Stellen wo der Compiler ein A hat und Funktionen die bloss ein B entgegennehmen darf er den Konstruktor <code>explicit B(A const&amp;)</code> nicht verwenden um die Konvertierung durchzuführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224567</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 18 Jun 2012 15:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Mon, 18 Jun 2012 15:26:56 GMT]]></title><description><![CDATA[<p>Incocnito schrieb:</p>
<blockquote>
<p>Also wenn ich das jetzt richtig verstanden hab, wird hier</p>
<pre><code class="language-cpp">struct Zahl
{
    int wert;
    Zahl(int x) : wert(x) {}
};

//...

Zahl z = 3;
</code></pre>
<p>Zahl z = 3 zu Zahl z(Zahl(3))</p>
</blockquote>
<blockquote>
<p>und dann wird implizit der jeweilige (automatisch generierte) Kopierkonstruktor aufgerufen?</p>
</blockquote>
<p>Da bin ich mir nicht sicher aber ich denke dass da einfach der Konvertierungskonstruktor aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224572</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 18 Jun 2012 15:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Typendeklaration = und () on Tue, 19 Jun 2012 07:24:22 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Incocnito schrieb:</p>
<blockquote>
<p>und dann wird implizit der jeweilige (automatisch generierte) Kopierkonstruktor aufgerufen?</p>
</blockquote>
<p>Da bin ich mir nicht sicher aber ich denke dass da einfach der Konvertierungskonstruktor aufgerufen wird.</p>
</blockquote>
<p>Wenn ich das richtig im Kopf hab ist beides ganz knapp daneben, die Wahrheit liegt dazwischen:</p>
<ol>
<li>Der automatisch generierte Copy-Ctor <em>kann</em> hier aufgerufen werden. er sollte aber auf jeden Fall erreichbar sein (d.h. nicht private/protected)</li>
<li>Der Copy-Ctor <em>muss</em> nicht aufgerufen werden. IIRC sagt der Standard explizit, dass er zwar existieren muss, aber wegoptimiert werden darf.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2224871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224871</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Jun 2012 07:24:22 GMT</pubDate></item></channel></rss>