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;
    }
    
    1. Wie kann a ausgegeben werden ?
    2. DIe Erzeugung des 1. Konstruktors in der main-Funktion
      klappt nicht (konstr(int)).


    1. Das ist Standard C++ und hat nichts mit GUIs zu tun.
    2. Wenn Zeile 13 auskommentiert ist wird a nicht ausgegeben
    3. 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 von konstr aufgerufen. Damit das auch richtig funktioniert, solltest Du die Klasse konstr 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.


Log in to reply