<?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[Komische Objektinitialisierung]]></title><description><![CDATA[<p>Hi!</p>
<p>Hab ein Problem entdeckt das sich mir nicht ganz erschließt:</p>
<pre><code class="language-cpp">A a; // aufruf von default c'tor
A a(); // geht nich da dies als funktionsdeklaration interpertiert wird
A a( 1 ); // aufruf von überladenem c'tor
A a = A(); // aufruf vom copy c'tor, equivalent zu A a( A() );
A a = A( 1 ); // aufruf vom copy c'tor, equivalent zu A a( A( 1 ) );
</code></pre>
<p>Soweit sogut, nun habe ich folgende Klasse:</p>
<pre><code class="language-cpp">class Base
{
protected:
	Base()
	{}

	Base( int i )
	{}
};

class Derived : public Base
{
public:
	Derived( int i ) : Base( i )
	{
		Base a; // 1
		Base a( 1 ); // 2
		Base a = Base(); // 3
		Base a = Base( 1 ); // 4
	}
};
</code></pre>
<p>1 und 2 bringen Fehler, da die entsprechenden Konstruktoren ja geschützt sind. 4 bringt auch einen Fehler da Base( int ) geschützt ist aber 3 kompiliert.</p>
<p>Mein erster Gedanke war, der copy c'tor ist ja public ergo: ein Objekt kann kopiert werden aber: Wieso kann ein temporäres Objekt angelegt werden wenn der default c'tor doch geschützt ist?</p>
<p>Zweiter Gedanke: Der copy c'tor hat das Recht ein Objekt zu erzeugen, egal ob der Konstruktor geschützt ist oder nicht. Aber: Wieso funktioniert dann ein überladener Konstruktor nicht?</p>
<p>Nun habe ich den copy c'tor mal geschützt und siehe da, 3. kompiliert nichtmehr also liegt es tatsächlich am copy c'tor. Was aber nicht erklärt das 4. nicht auch funktioniert.<br />
Außerdem wurde der copy c'tor garnicht aufgerufen (über irgendwelche Ausgaben getestet) sondern direkt der standard c'tor.</p>
<p>Nun habe ich im Internet gesucht und auf einer Microsoft Entwickler Page folgendes gefunden:</p>
<blockquote>
<p>This means that</p>
<p>A a = A();</p>
<p>is treated as if it is direct-initialization and this means that the copy constructor is not invoked.</p>
</blockquote>
<p>Das würde also erklären warum der copy c'tor nicht aufgerufen wurde. Aber ist das tatsächlich konform? Ich hab nichts dergleichen finden können im Standard.<br />
Und zu allem Elend kompiliert der g++ den obigen Code nicht und bringt die, von mir egtl erwartete, Meldung das der default c'tor <strong>protected</strong> ist.</p>
<p>Viele Grüße</p>
<p>Edit: Vergessen zu erwähnen, auf VS (2003 und 2005) kompiliert den Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186373/komische-objektinitialisierung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:11:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186373.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Jul 2007 09:27:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 09:40:26 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Hab ein Problem entdeckt das sich mir nicht ganz erschließt:</p>
<pre><code class="language-cpp">A a; // aufruf von default c'tor
A a(); // geht nich da dies als funktionsdeklaration interpertiert wird
A a( 1 ); // aufruf von überladenem c'tor
A a = A(); // aufruf vom copy c'tor, equivalent zu A a( A() );
A a = A( 1 ); // aufruf vom copy c'tor, equivalent zu A a( A( 1 ) );
</code></pre>
<p>Soweit sogut, nun habe ich folgende Klasse:</p>
<pre><code class="language-cpp">class Base
{
protected:
	Base()
	{}

	Base( int i )
	{}
};

class Derived : public Base
{
public:
	Derived( int i ) : Base( i )
	{
		Base a; // 1
		Base a( 1 ); // 2
		Base a = Base(); // 3
		Base a = Base( 1 ); // 4
	}
};
</code></pre>
<p>1 und 2 bringen Fehler, da die entsprechenden Konstruktoren ja geschützt sind. 4 bringt auch einen Fehler da Base( int ) geschützt ist aber 3 kompiliert.</p>
<p>Mein erster Gedanke war, der copy c'tor ist ja public ergo: ein Objekt kann kopiert werden aber: Wieso kann ein temporäres Objekt angelegt werden wenn der default c'tor doch geschützt ist?</p>
<p>Zweiter Gedanke: Der copy c'tor hat das Recht ein Objekt zu erzeugen, egal ob der Konstruktor geschützt ist oder nicht. Aber: Wieso funktioniert dann ein überladener Konstruktor nicht?</p>
<p>Nun habe ich den copy c'tor mal geschützt und siehe da, 3. kompiliert nichtmehr also liegt es tatsächlich am copy c'tor. Was aber nicht erklärt das 4. nicht auch funktioniert.<br />
Außerdem wurde der copy c'tor garnicht aufgerufen (über irgendwelche Ausgaben getestet) sondern direkt der standard c'tor.</p>
<p>Nun habe ich im Internet gesucht und auf einer Microsoft Entwickler Page folgendes gefunden:</p>
<blockquote>
<p>This means that</p>
<p>A a = A();</p>
<p>is treated as if it is direct-initialization and this means that the copy constructor is not invoked.</p>
</blockquote>
<p>Das würde also erklären warum der copy c'tor nicht aufgerufen wurde. Aber ist das tatsächlich konform? Ich hab nichts dergleichen finden können im Standard.<br />
Und zu allem Elend kompiliert der g++ den obigen Code nicht und bringt die, von mir egtl erwartete, Meldung das der default c'tor <strong>protected</strong> ist.</p>
<p>Viele Grüße</p>
<p>Edit: Vergessen zu erwähnen, auf VS (2003 und 2005) kompiliert den Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320560</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 08 Jul 2007 09:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 09:54:34 GMT]]></title><description><![CDATA[<p>g++ ist da scheinbar anderer Meinung:</p>
<pre><code>darthdespotism@akazieLX:~$ g++ main.cpp
main.cpp: In constructor »Derived::Derived(int)«:
main.cpp:4: Fehler: »Base::Base()« ist geschützt
main.cpp:16: Fehler: in diesem Zusammenhang
</code></pre>
<pre><code>darthdespotism@akazieLX:~$ g++ --version
g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
Copyright (C) 2006 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE ZWECKE.
</code></pre>
<pre><code>darthdespotism@akazieLX:~$ cat main.cpp
class Base 
{ 
protected: 
    Base() 
    {} 

    Base( int i ) 
    {} 
}; 

class Derived : public Base 
{ 
public: 
    Derived( int i ) : Base( i ) 
    { 
        Base a = Base(); // 3 
    } 
};

int main()
{

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1320569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320569</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Sun, 08 Jul 2007 09:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 09:56:29 GMT]]></title><description><![CDATA[<p>Genau, hab ich bereits getestet (steht auch im Post ;)). Ich <strong>vermute</strong> ja das es ein Bug in VC++ ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320570</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 08 Jul 2007 09:56:29 GMT</pubDate></item><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 10:31:47 GMT]]></title><description><![CDATA[<p>It's not a bug, it's a feature.</p>
<p>BTW: Comeau ist derselben Meinung wie gcc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320579</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 08 Jul 2007 10:31:47 GMT</pubDate></item><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 10:45:22 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Genau, hab ich bereits getestet (steht auch im Post ;)). Ich <strong>vermute</strong> ja das es ein Bug in VC++ ist.</p>
</blockquote>
<p>Uups hab ich überlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320586</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Sun, 08 Jul 2007 10:45:22 GMT</pubDate></item><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 11:20:37 GMT]]></title><description><![CDATA[<p>ist ein bug, ja. die MS-entwickler gestehen in sich sogar ein, aber finden es nicht so wichtig - ergo wird er nicht korrigiert. tja.</p>
<p>dazu gabs vor zwei, drei wochen schonmal nen thread. ich finde ihn gerade nicht, aber die betreffende stelle im standard, die MS falsch interpretiert, ist 8.5/14/4/2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320606</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 08 Jul 2007 11:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Komische Objektinitialisierung on Sun, 08 Jul 2007 11:30:32 GMT]]></title><description><![CDATA[<p>Hm... Dacht ichs mir doch! <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="😉"
    /> Danke für die Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320617</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 08 Jul 2007 11:30:32 GMT</pubDate></item></channel></rss>