Initialisiererliste
-
Hey,
ich würde gerne wissen, wann es notwendig ist eine initialisiererliste zu verwenden? Ich versteh das nicht. Muss man bei der Initialisierung irgendwas beachten?
Am besten wär das verständlich, wenn jemand mir das an einem Bsp. erklären könnte, da nur durch eine Initialisiererliste zu verwirklichen ist.
Danke schonmal
-
Erstens: Initialisierungslisten sind immer nützlich, wenn du ein Objekt konstruierst, unabhängig davon ob es auch anders möglich ist.
Zweitens: Basisklassen kannst du nur über Initialisierungsliste konstruieren, genauso Member, die keinen Default-Konstruktor haben (inklusive konstante Elemente und Referenzen)
-
Wie der Name schon sagt, initialisiert die Initialisierungsliste die Member. Würdest du die Initialisierungsliste nicht verwenden, hättest du eine Definition+Zuweisung.
Wenn Nexus nichts dagegen hat, zitiere ich mal noch einen Beitrag von ihm.

Nexus schrieb:
Wofür die Initialisierungsliste zwingend notwendig ist:
const-qualifizierte Membervariablen- Referenzen
- Member ohne Defaultkonstruktor
- Member, die den Zuweisungsoperator nicht unterstützen
- Basisklassen ohne Defaultkonstruktor
Grundsätzlich empfiehlt es sich, immer die Initialisierungsliste zu verwenden.
lg
-
Ok, das hilft mir schonmal sehr weiter. Ich komm von C und versuche mich gerade in C++ einzuarbeiten. Kannst du mir vielleicht noch ein kurzes Programmierungsbsp. zu einem Member ohne Defaultkonstruktor?
-
Riko schrieb:
Ok, das hilft mir schonmal sehr weiter. Ich komm von C und versuche mich gerade in C++ einzuarbeiten. Kannst du mir vielleicht noch ein kurzes Programmierungsbsp. zu einem Member ohne Defaultkonstruktor?
..geben?
-
Klar, aber ohne Garantie auf Praxisbezug:
//Die Klasse hat einen benutzerdefinierten Konstruktor, also stellt der Compiler keinen Default-Konstruktor mehr zur Verfügung: class part { ... public: part(int size); ... }; class full { part member; public: full() : member(4711) {...} };
-
Vielen Dank.
-
Noch eine Frage

Wenn ich folgendes Bsp. gegeben habe
c l a s s C1 { p r i v a t e : i n t z a h l 1 , z a h l 2 , z a h l 3 ; }und einen Konstruktor erstellen will, bei dem alle Paramter initialisiert werden, was für ein Vorteil hat das, dass mit einer Initialisierliste zu machen im Vergleich zu einem mit this.Zeiger? Wie würden beide Umsetzungen auf dieses Bsp. bezogen aussehen, um das im Vergleich zu sehen? ( zumindestens das mit dem this.Zeiger )
-
Dann macht es (fast) keinen Unterschied (vielleicht wir dann alles doppelt zugewiesen aber der Compiler sollte das schon vermeiden). Wieso schreibst du alles durch Leerzeichen getrennt?
-
der macht das manchmal, wenn ich etwas aus visuell c++ kopiere.
-
..ich hatte dieses Bsp. zuvor in einem Forum kopiert und versucht das selber zu schreiben, aber ich versteh nicht, wie ich das als this.Zeiger schreibe.
-
aus einem Forum kopiert/geklaut..wie man das auch sagt

-
So:
struct Klasse { private: int Zahl1, Zahl2, Zahl3; public: Klasse(int Zahl1, Zahl2, Zahl3) { this->Zahl1 = Zahl1; this->Zahl2 = Zahl2; this->Zahl3 = Zahl3; } };
-
Nur mal grob hingeworfen:
mit Zuweisungen:C1(int value) { zahl1 = value; //hier könntest du auch this->zahl1 schreiben, ist aber nicht notwendig zahl2 = 2*value; zahl3 = 1; }mit Initialisierungsliste:
c1(int value) : zahl1(value) , zahl2(2*value) , zahl3(0) {}Bei int-Werten macht es keinen großen Unterschied, weil deren Default-Konstruktor nicht wirklich viel zu tun hat - und jeder vernünftige Compiler den Code optimieren kann. Problematisch wird es, wenn du dort mit Klassen arbeitest, die nicht-triviale Konstruktoren haben.
Edit: Pointer-Zuriff korrigiert

-
Man kann ja auch so gut auf die Member einer Klasse über einen Zeiger mit dem
.-Operaror zugreiffen
.
-
EOutOfResources schrieb:
Man kann ja auch so gut auf die Member einer Klasse über einen Zeiger mit dem
.-Operaror zugreiffen
.War wohl nur n Tippfehler, passiert dir sicherlich oft genug

-
Ja, besten Dank nochmal. Hat mir wirklich weiter geholfen.
-
Ich habe zu diesem Thema auch eine Frage. Benutzt man die Initialisierungsliste nun nur für "primitive" Datentypen wie bool, double, int usw. oder sollte man wirklich alle Member einer Klasse in die Liste schreiben? Macht es also Sinn z.B. den std::wstring-Member einer Klasse in die Initialisierungsliste zu schreiben?
Wenn ja mit welchem Wert sollte man diesen Member initialisieren?class MyClass { public: MyClass() : myString() // oder //myString(0) // oder //myString(L"") { } private: std::wstring myString; };Das wird dem Compiler wahrscheinlich egal sein, aber welche Variante ist optisch vorzuziehen?
-
Wenn du den Default-Konstruktor aufrufen möchtest, brauchst du gar nichts tun.
-
Achso, der wird dann also automatisch aufgerufen.
Eine letzte Frage noch. Warum verwendet man bei structs ZeroMemory?
Z.B. hier:WNDCLASSEX wcex; ZeroMemory(&wcex, sizeof(WNDCLASSEX));Haben Strukturen keine Initialisierungsliste?
-
bzw. wird hier nicht der Default-Constructor aufgerufen?