"Exotischer" Konstruktor
-
Hallo,
vielen Dank für die schnellen Antworten. Ich sah bisher eben immer nur Variante A - gut ich bin auch ein totaler Anfäger.
@Scott
in der zweiten Version wird Leistung default-initialisiert und dann wird iLeistung nach Leistung kopiert.Kannst du mir noch etwas genauer erklären, oder einen Tipp geben, was damit gemeint ist?
Ich dachte der default-Konstruktor wird nur dann aufgerufen, wenn dem Objekt keine Parameter übergeben werden, was hier ja nicht der Fall ist.Vielen Dank für alle Tipps

Valjean
-
Der Ablauf beim Aufruf des Konstruktors A sieht wie folgt aus:
Die (nicht vorhandene) Initialisierungsliste von A wird ausgeführt. Nachdem das erledigt ist, sind die Member initialisiert.
Da nicht näher spezifiziert ist, welcher Konstruktor von Leistung aufgerufen wird, wird der Default-Konstruktor genommen. Der nimmt die vorhanden Bits im Speicher an.
Anschließend wird der Anweisungsteil betreten und der Wert von iLeistung wird nach Leistung kopiert.
-
Nathan schrieb:
... Nachdem das erledigt ist, ist die Klasse initialisiert. ...
Schlechte Formulierung!
Nachdem das erledigt ist, sind die Member initialisiert.
-
Ja, ok, meinetwegen...

-
Und mit "schlechte Formulierung" meine ich "Falsche" :p
-
Nur mal so nebenbei, wovon redest du eigentlich?
Wann habe ich das geschrieben?
Und wieso wäre die falsch, die Klasse ist doch initalisiert?
-
a) Klassen werden nicht initialisiert sonder Objekte.
b) Das Objekt ist initilasiert wenn der Konstruktor fertig ist.
-
c) Die Member sind zwar default-initialisiert, haben aber nicht immer einen definierten Wert. Ein int-Member könnte jeden beliebigen Wert haben (23512 oder -51215 oder manchmal auch 0). Nur damit wir uns einig sind, was "initialisiert" bedeutet.
-
Ja, stimmt eigentlich.
Ist aber schon längst korrigiert.
-
nachtrag schrieb:
c) Die Member sind zwar default-initialisiert, haben aber nicht immer einen definierten Wert. Ein int-Member könnte jeden beliebigen Wert haben (23512 oder -51215 oder manchmal auch 0). Nur damit wir uns einig sind, was "initialisiert" bedeutet.
Jopp, weils 'n POD ist kann man nicht default-initialsiert sagen.
POD's bleiben einfach uninitialisiert, wenn sie nicht in der Initialisierungsliste auftauchen.
-
Nathan schrieb:
Da nicht näher spezifiziert ist, welcher Konstruktor von Leistung aufgerufen wird, wird der Default-Konstruktor genommen. Der nimmt die vorhanden Bits im Speicher an.
Hier wird gar kein Konstruktor aufgerufen.
Der Standard spricht in dem Zusammenhang auch nicht von Konstruktoren, sondern davon wie das Member "initialized" wird.
Und in diesem Fall wird halt gar nicht "initialized".Es gibt auch keinen "Default-Konstruktor" für Integers. Das was dem "Default-Konstruktor" bei Integers am nähesten kommt ist "zero initialization", und die übernimmt nicht einfach die Bits an der Stelle im Speicher, sondern initialisiert den Integer mit Null.
Die ganze Initialisierungs-Geschichte ist in C++ halbwegs unübersichtlich und unintuitiv, daher sollte man sich nicht schnell zu Aussagen hinreissen lassen was hier passiert, es sei denn man hat die Sache wirklich genau im Kopf.
-
Ja, du hast natürlich recht.
Weil int ein POD ist gilt das natürlich nicht ganz, was ich gesagt habe.
Ich finde allerdings trotzdem, dass man sich dann die Sachen besser vorstellen kann, was da passiert, wenn man es so formuliert.