Konstruktor für Anfänger
-
Folgender Code:
#include <iostream> using namespace std; class konstr{ public: int a=1; konstr(int); konstr(); }; int main() { konstr k(); cout << "Hello, World!\n"; //cout << k.a; }
- Wie kann a ausgegeben werden ?
- DIe Erzeugung des 1. Konstruktors in der main-Funktion
klappt nicht (konstr(int)).
-
- Das ist Standard C++ und hat nichts mit GUIs zu tun.
- Wenn Zeile 13 auskommentiert ist wird a nicht ausgegeben
- Zeile 11 ist eine fiese Eigenart von C++ und nennt sich most vexing parse. Für den Aufruf des Standardkonstruktors brauchst du die Klammern nicht.
-
Für den Konstruktor mit Parameter(n) werden aber dann die Klammern benötigt:
konstr k(42);
PS: Du mußt die Konstruktoren aber auch noch definieren, ansonsten erhältst du einen Linkerfehler ("missing function").
-
Der Konstruktor wird nicht in
main
„erzeugt“, sondern dort sollte ein Objekt k angelegt werden, und bei dessen Konstruktion wird dann der Konstruktor vonkonstr
aufgerufen. Damit das auch richtig funktioniert, solltest Du die Klassekonstr
definieren.class konstr { public: int a; konstr () : a(1) {}; // Nachtrag wenn keine konversion von int gewollt ist. explicit konstr (const int i) : a(i) {}; };
wäre z.B. eine bessere Variante.
-
Oder gleich mit Standardparameter:
konstr (int i = 1) : a(i) {}; // const ist unnötig
-
@Th69 sagte in Konstruktor für Anfänger:
Oder gleich mit Standardparameter:
konstr (int i = 1) : a(i) {}; // const ist unnötig
Nein, genau das nicht, da man hierbei still und leise einen Konversionskonstruktor erstellt hat. Konstruktoren mit einem Parameter sollten immer
explicit
sein, außer man man will ausdrücklich, dass sie als Konversionskonstruktor genutzt werden können.
-
Du hast das
explicit
ja auch nacheditiert - und für einen Anfänger ist das eher verwirrend.
Ich sehe hier aber auch keinen Nachteil.
-
@Th69 sagte in Konstruktor für Anfänger:
Du hast das
explicit
ja auch nacheditiert - und für einen Anfänger ist das eher verwirrend.Asche auf mein Haupt – ja wenn man zu schnell Antworten schreibt passieren Fehler.
Ich sehe hier aber auch keinen Nachteil.
Hier ja, aber es gibt auch andere Fälle, wo es sehr hässliche Effekte hat.