Unterschied Konstruktor
-
Hallo,
ich habe laut meinem "C++ Buch" 2 Möglichkeiten ein Objekt zu erzeugen.
a)
CKlassenname *Objekt;
Objekt = new CKlassenname;b)
CKlassenname Objekt;wobei bei b) das Objekt gleich instanziiert weden soll...
Allerdings schein mein Buch da zu lügen, da es einen Unterschied zu geben scheint,
as z.B. Änderungen in den Eigenschaften bei b) nicht übernommen werden...kann mich einer Aufklären?
Gruß
Newbee
-
Im ersten Fall ist Objekt ein Zeiger auf eine Variable vom Typ CKlassenname. Das Objekt selber wird erzeugt durch new und durch die Zuweisung wird die Adresse des erzeugten Objektes in der Zeigervariablen gespeichert.
Zugegriffen auf Member dieses Objektes wird über den -> Operator, zB:
Objekt->zahl = 5;
falls in CKlassenname zB eine public Integervariable mit der Bezeichnung zahl existiert.
Im zweiten Fall wird das Objekt direkt erzeugt und in der Variable Objekt gespeichert. Hier wird mit dem . Operator zugegriffen, zB:
Objekt.zahl = 5;
Im ersten Fall ist Objekt ein Zeiger auf einen Speicherbereich, in dem mittels new eine Instanz der Klasse CKlassenname angelegt wird.
Im zweiten Fall ist Objekt selbst die Instanz.
-
Und:
Mit new landen die Objekte auf dem Heap und ihre Lebensdauer ist solange bis delete aufgerufen wird (zu jedem new muss es ein delete geben und gleich bei new[] und delete[]).Ohne new landen die Objekte auf dem Stack und werden zerstört sobald der Scope verlassen wird.
Simon
-
Hmm,
danke für die Antworten.
Also der Beschreibung dürfte es bis auf die Qualifizierung der Members
keinen Unterschied machen.Ich habe eine Objekt, welches ein Array von Klassen/Objekten enthält.
Wenn ich dieses als Instanz anlege ( CKlasse Objekte[6] ) kann ich zwar drauf die members der Objekte schreiben und lesen, allerdings werden die geschreibenen Werte nicht übernommen, dh. beim lesen des Wertes kommt immer 0 raus.Wenn ich allerdings CKlasse *Objekte[6] definiere und jedes Object mit Objeckte[i] new CKlasse() instanziire geht es problemlos.
Woran kann dieses Verhalten den liegen? Der Compiler (g++) meckert bei keinen der beiden Varianten.
Gruß
Newbee
-
Newbee2 schrieb:
Also der Beschreibung dürfte es bis auf die Qualifizierung der Members keinen Unterschied machen.
Macht es auch nicht. Ich gehe in deinen Fall von einen anderen Fehler aus, dazu ist aber Sourcecode nötig.
cu André