<?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[überladener cast Operator]]></title><description><![CDATA[<p>Hab hier folgende Aufgabenstellung:</p>
<p>3.1<br />
Welche Werte gibt das folgende Programm aus?<br />
#include &lt;cstdio&gt;<br />
class complex<br />
{<br />
public:<br />
double re, im;<br />
operator double () { return re + im; }<br />
};<br />
complex x;<br />
int main()<br />
{<br />
<a href="http://x.re" rel="nofollow">x.re</a> = 1.0;<br />
<a href="http://x.im" rel="nofollow">x.im</a> = 1.0;<br />
complex cc[2] = { {x}, {x}}; //nur diese Zeile ist in der Aufgabe 3.2 anders<br />
printf (&quot;%g %g\n&quot;, cc[0].re, cc[1].re);<br />
return 0;<br />
}<br />
3.2.<br />
Welche Werte gibt das folgende Programm aus?<br />
#include &lt;cstdio&gt;<br />
class complex<br />
{<br />
public:<br />
double re, im;<br />
operator double () { return re + im; }<br />
};<br />
complex x;<br />
int main()<br />
{<br />
<a href="http://x.re" rel="nofollow">x.re</a> = 1.0;<br />
<a href="http://x.im" rel="nofollow">x.im</a> = 1.0;<br />
complex cc[2] = { x, x}; //nur jenes ist anders<br />
printf (&quot;%g %g\n&quot;, cc[0].re, cc[1].re);<br />
return 0;<br />
}<br />
Anmerkung<br />
Die o. a. Beispiele stammen aus „Dr. Dobbs Journal“, einer US-Fachzeitschrift für Praktiker der Software-Entwicklung.</p>
<p>1.Frage<br />
Hab diese beiden Programme ablaufen lassen und feststellen müssen, dass für die<br />
Aufgabe 3.1 der überladene cast operator aufgerufen wird und für die 3.2 nicht.<br />
Was ändern die {} beim Aufruf: complex cc[2] = { {x}, {x}}; im Gegensatz zu<br />
complex cc[2] = { x, x}; ?</p>
<p>2.Frage<br />
Hab jenes mit den Visualstudio gemacht und jedes Programm lieferte unterschiedliche Werte. Wenn mann es aber mit einen GNU compiler<br />
übersetzt nimmt er gar nicht den cast operator und beide Programme laufen identisch. Wie kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218380/überladener-cast-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 03:47:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218380.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Jul 2008 12:31:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to überladener cast Operator on Sun, 20 Jul 2008 12:31:18 GMT]]></title><description><![CDATA[<p>Hab hier folgende Aufgabenstellung:</p>
<p>3.1<br />
Welche Werte gibt das folgende Programm aus?<br />
#include &lt;cstdio&gt;<br />
class complex<br />
{<br />
public:<br />
double re, im;<br />
operator double () { return re + im; }<br />
};<br />
complex x;<br />
int main()<br />
{<br />
<a href="http://x.re" rel="nofollow">x.re</a> = 1.0;<br />
<a href="http://x.im" rel="nofollow">x.im</a> = 1.0;<br />
complex cc[2] = { {x}, {x}}; //nur diese Zeile ist in der Aufgabe 3.2 anders<br />
printf (&quot;%g %g\n&quot;, cc[0].re, cc[1].re);<br />
return 0;<br />
}<br />
3.2.<br />
Welche Werte gibt das folgende Programm aus?<br />
#include &lt;cstdio&gt;<br />
class complex<br />
{<br />
public:<br />
double re, im;<br />
operator double () { return re + im; }<br />
};<br />
complex x;<br />
int main()<br />
{<br />
<a href="http://x.re" rel="nofollow">x.re</a> = 1.0;<br />
<a href="http://x.im" rel="nofollow">x.im</a> = 1.0;<br />
complex cc[2] = { x, x}; //nur jenes ist anders<br />
printf (&quot;%g %g\n&quot;, cc[0].re, cc[1].re);<br />
return 0;<br />
}<br />
Anmerkung<br />
Die o. a. Beispiele stammen aus „Dr. Dobbs Journal“, einer US-Fachzeitschrift für Praktiker der Software-Entwicklung.</p>
<p>1.Frage<br />
Hab diese beiden Programme ablaufen lassen und feststellen müssen, dass für die<br />
Aufgabe 3.1 der überladene cast operator aufgerufen wird und für die 3.2 nicht.<br />
Was ändern die {} beim Aufruf: complex cc[2] = { {x}, {x}}; im Gegensatz zu<br />
complex cc[2] = { x, x}; ?</p>
<p>2.Frage<br />
Hab jenes mit den Visualstudio gemacht und jedes Programm lieferte unterschiedliche Werte. Wenn mann es aber mit einen GNU compiler<br />
übersetzt nimmt er gar nicht den cast operator und beide Programme laufen identisch. Wie kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550174</guid><dc:creator><![CDATA[sepplhuber]]></dc:creator><pubDate>Sun, 20 Jul 2008 12:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to überladener cast Operator on Sun, 20 Jul 2008 16:30:05 GMT]]></title><description><![CDATA[<p>sepplhuber schrieb:</p>
<blockquote>
<p>... Was ändern die {} beim Aufruf: complex cc[2] = { {x},{x}}; im Gegensatz zu complex cc[2] = { x, x}; ? ...</p>
</blockquote>
<p>Hallo!</p>
<p>Deine Klasse complex enthält keine privaten Member, keine virtuellen Funktionen, keine static Member, keine selbstdefinierten Konstruktoren und auch keine Basisklasse. Sie stellt also ein Aggregat dar (siehe Standard 8.5.1), welches auf besondere Weise initialisiert werden kann. Z.B. durch Aufzählung der Member in geschweiften Klammern:</p>
<pre><code class="language-cpp">complex y = {2.0, 3.0};

complex ay[2] = { {2.0, 3.0} , {4.0, 5.0} };
complex by[2] = { {2.0}      , {4.0, 5.0} };
</code></pre>
<p>Beim ersten Element von by wurde das zweite Member weggelassen, was dazu führt, dass es mit Null initialisiert wird.</p>
<pre><code class="language-cpp">cc[2] = { {x}, {x} };
</code></pre>
<p>ist eigentlich nichts anderes, als</p>
<pre><code class="language-cpp">cc[0] = {x};
cc[1] = {x};
</code></pre>
<p>Hierbei wird cc[0].re mit 2.0 initialisiert, weil es ja die Umwandlungsfunktion von complex nach double gibt. cc[0].im wird mit 0.0 initialisiert, weil dafür keine Angaben gemacht wurden. Für cc[1] passiert dasselbe.</p>
<p>Ohne die inneren geschweiften Klammern</p>
<pre><code class="language-cpp">cc[2] = { x, x};
</code></pre>
<p>werden die Elemente im Array direkt mit dem Objekt x initialisiert.</p>
<p>sepplhuber schrieb:</p>
<blockquote>
<p>... 2.Frage<br />
Hab jenes mit den Visualstudio gemacht und jedes Programm lieferte unterschiedliche Werte. Wenn mann es aber mit einen GNU compiler<br />
übersetzt nimmt er gar nicht den cast operator und beide Programme laufen identisch. Wie kann das sein? ...</p>
</blockquote>
<p>Welcher GNU-Compiler in welcher Version liefert die Werte?</p>
<p>Gruß</p>
<p>/edit/<br />
Wenn du der Klasse complex etwas hinzufügst, das ihr den Status eines Agregats wegnimmt, z.B. ein virtuelle Funktion ist die Initialisierung im ersten Programmbeispiel nicht mehr möglich.</p>
<p>Also, mit</p>
<pre><code class="language-cpp">class complex
{
public:
 double re, im;
 virtual void foo() {}; //!!!
 operator double () { return re + im;  }
};
</code></pre>
<p>Führt die Zeile</p>
<pre><code class="language-cpp">complex cc[2] = { {x}, {x}}; //nur diese Zeile ist in der Aufgabe 3.2 anders
</code></pre>
<p>zum Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550307</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Sun, 20 Jul 2008 16:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to überladener cast Operator on Sun, 20 Jul 2008 16:26:37 GMT]]></title><description><![CDATA[<p>Ohne Formatierung werden das nur wenige lesen. So schwer kann das doch nicht sein:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
class complex
{
public:
double re, im;
operator double () { return re + im; }
};
complex x;
int main()
{
x.re = 1.0;
x.im = 1.0;
complex cc[2] = { {x}, {x}}; //nur diese Zeile ist in der Aufgabe 3.2 anders
printf (&quot;%g %g\n&quot;, cc[0].re, cc[1].re);
return 0;
}
</code></pre>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
class complex
{
public:
double re, im;
operator double () { return re + im; }
};
complex x;
int main()
{
x.re = 1.0;
x.im = 1.0;
complex cc[2] = { x, x}; //nur jenes ist anders
printf (&quot;%g %g\n&quot;, cc[0].re, cc[1].re);
return 0;
}
</code></pre>
<p>Auch ich lese erst jetzt den Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550308</guid><dc:creator><![CDATA[[cpp][&#x2F;cpp]]]></dc:creator><pubDate>Sun, 20 Jul 2008 16:26:37 GMT</pubDate></item><item><title><![CDATA[Reply to überladener cast Operator on Sun, 20 Jul 2008 21:35:01 GMT]]></title><description><![CDATA[<p>Danke für die sehr hilfreiche und kompetente Antwort.<br />
Version des Compilers muss ich erst nachfragen, da jenes Phänomen bei einem Freund auftauchte. Poste es wenn ich sie weiß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550541</guid><dc:creator><![CDATA[sepplhuber]]></dc:creator><pubDate>Sun, 20 Jul 2008 21:35:01 GMT</pubDate></item></channel></rss>