<?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[expicit - Konvertierung verhindern]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Wie ihr es euch vermutlich bereits denken könnt ;), habe ich wieder mal ein Verständnisproblem in C++.</p>
<p>In meinem Buch wurde soeben das Schlüsselwort 'explicit' eingeführt.<br />
In dem Kapitel ging es um Konstruktoren und das indem man dem Konstruktor das Wort explicit voranstellt eine Konvertierung vom Übergabeparameter des Konstruktors zum Klassentyp verhindert wird.</p>
<p>Ich verstehe aber nicht, was dann der Konstruktor noch bringen soll.<br />
Der konstruktor initialisiert das Objekt für das er aufgerufen wurde.<br />
Doch wenn man ihn wegen explicit nicht mehr aufrufen kann, oder er nicht mehr konvertieren kann bringt er doch nichts.</p>
<p>Zudem verstehe ich nicht zu 100%, was mit Konvertieren gemeint ist.<br />
Der Konstruktor konvertier doch nicht- <strong>er initialisiert lediglich.</strong></p>
<p>Wäre nett wenn mir jemand helfen könnte.</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200391/expicit-konvertierung-verhindern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 20:46:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200391.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Dec 2007 09:36:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 09:36:34 GMT]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Wie ihr es euch vermutlich bereits denken könnt ;), habe ich wieder mal ein Verständnisproblem in C++.</p>
<p>In meinem Buch wurde soeben das Schlüsselwort 'explicit' eingeführt.<br />
In dem Kapitel ging es um Konstruktoren und das indem man dem Konstruktor das Wort explicit voranstellt eine Konvertierung vom Übergabeparameter des Konstruktors zum Klassentyp verhindert wird.</p>
<p>Ich verstehe aber nicht, was dann der Konstruktor noch bringen soll.<br />
Der konstruktor initialisiert das Objekt für das er aufgerufen wurde.<br />
Doch wenn man ihn wegen explicit nicht mehr aufrufen kann, oder er nicht mehr konvertieren kann bringt er doch nichts.</p>
<p>Zudem verstehe ich nicht zu 100%, was mit Konvertieren gemeint ist.<br />
Der Konstruktor konvertier doch nicht- <strong>er initialisiert lediglich.</strong></p>
<p>Wäre nett wenn mir jemand helfen könnte.</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420364</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 14 Dec 2007 09:36:34 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 09:58:06 GMT]]></title><description><![CDATA[<p>Der Konstruktor konvertiert nicht, aber die Sprache C++ für Dich. Bei expliziten Konstruktoren finden solche Konvertierungen hingegen nicht statt. Aber ein Beispiel sagt oft mehr als 1000 Worte:</p>
<pre><code class="language-cpp">class Vector
{
public:
    explicit Vector(size_t groesse);
};

Vector v = 12; // Compilerfehler
</code></pre>
<p>Wäre der Konstruktor <strong>nicht</strong> explicit, wäre die letzte Zeile erlaubt. Rein semantisch ergibt sie aber keinen Sinn (&quot;Huch, ein Vector mit dem Wert 12? Der Größe 12? Oder soll 12 das erste Element sein?&quot; - jedenfalls kein verständlicher Kandidat). Oder noch drastischer:</p>
<pre><code class="language-cpp">std::ifstream ifs = &quot;Hallo, Welt&quot;;
</code></pre>
<p>Wäre der Konstruktor von ifstream nicht explicit, wäre dies möglich und würde die Datei &quot;Hallo, Welt&quot; öffnen. Aber schön sieht das nicht aus, oder? Zumal man damit ziemlich Schindluder treiben kann (in Situationen, wo man so eine Konvertierung nicht auf Anhieb sieht z.B.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420385</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 14 Dec 2007 09:58:06 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 10:25:04 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Wäre der Konstruktor <strong>nicht</strong> explicit, wäre die letzte Zeile erlaubt. Rein semantisch ergibt sie aber keinen Sinn (&quot;Huch, ein Vector mit dem Wert 12? Der Größe 12? Oder soll 12 das erste Element sein?&quot; - jedenfalls kein verständlicher Kandidat). Oder noch drastischer:</p>
</blockquote>
<p>(keine zeit für mehr)<br />
das argument zieht bei</p>
<pre><code class="language-cpp">vector&lt;int&gt; x(12);
</code></pre>
<p>aber doch genauso...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420407</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Fri, 14 Dec 2007 10:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 10:32:26 GMT]]></title><description><![CDATA[<p>Hier sieht man finde ich aber deutlicher, dass etwas konstruiert, und nichts konvertiert wird. Drastischer wird es z.B. bei Parameterübergabe:</p>
<pre><code class="language-cpp">void func(vector&lt;int&gt; vec);

// ohne explicit:
func(12); // erkennt jemand, was gemeint ist? ;)

// mit explicit:
func(vector&lt;int&gt;(12));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1420410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420410</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 14 Dec 2007 10:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 10:37:29 GMT]]></title><description><![CDATA[<p>Vector v = 12;</p>
<p>Durch '=' wird also der Konstruktor aufgerufen.</p>
<p>Oder durch ()</p>
<p>Vector v(12);</p>
<p>Wenn der Konstruktor mehr Argumente erwartet so:</p>
<p>Vector v(12,n);</p>
<p>Kann man mit dem '=' was ähnliches machen?</p>
<p>v = 12,n ...</p>
<p>Oder muss man über den '.'-Operator jedes Element einzeln ändern, wenn man neu zuweisen will?</p>
<p>Nur so ne Frage am Rand</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420414</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 14 Dec 2007 10:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 10:43:07 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Vector v = 12;</p>
<p>Durch '=' wird also der Konstruktor aufgerufen.</p>
<p>Oder durch ()</p>
<p>Vector v(12);</p>
</blockquote>
<p>Das ruft beides den Ctor auf - die erste Variante ist für explizite Konstruktoren allerdings nicht erlaubt. Als dritte Möglichkeit gibt es noch:</p>
<pre><code class="language-cpp">Vector v = Vector(12);
</code></pre>
<blockquote>
<p>Wenn der Konstruktor mehr Argumente erwartet so:</p>
<p>Vector v(12,n);</p>
<p>Kann man mit dem '=' was ähnliches machen?</p>
</blockquote>
<p>Die expliziten Varianten (&quot;Vector v(12,n);&quot; und &quot;Vector v=Vector(12,n);&quot;) lassen sich mit beliebig vielen Parametern verwenden, die implizite Variante &quot;Vector v=12;&quot; gibt es nur für Ctoren, die genau mit einem Argument aufgerufen werden können (und nicht als 'explicit' gekennzeichnet sind).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420419</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 14 Dec 2007 10:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 10:54:19 GMT]]></title><description><![CDATA[<p>Super- ihr habt mir echt geholfen.</p>
<p>Vektor v = Vektor(12);</p>
<p>musste man doch in Ansi C immer sagen.<br />
In C++ isses dann doch einfach vereinfacht worden- daher gibts noch die 3. Möglichkeit, ne?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420429</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 14 Dec 2007 10:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to expicit - Konvertierung verhindern on Fri, 14 Dec 2007 11:18:21 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Vektor v = Vektor(12);</p>
<p>musste man doch in Ansi C immer sagen.<br />
In C++ isses dann doch einfach vereinfacht worden- daher gibts noch die 3. Möglichkeit, ne?</p>
</blockquote>
<p>in C konnte man sowas garnicht sagen, es sei den Vektor() wäre eine Funktion gewesen. Konstruktoren gibt es erst seit C++</p>
<p>Und Vereinfachung würde ich nicht sagen. Explizite Konstruktoren haben schlicht und ergreifend den großen Vorteil das man nicht so einfach Fehler macht wie bei impliziten.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420436</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 14 Dec 2007 11:18:21 GMT</pubDate></item></channel></rss>