Member-Initialisierungslisten und Konstruktoren



  • Ich habe ein Verständnisproblem bei folgendem Codebeispiel:

    class A
    {
    public:
    A(int, const double&, const date&);
    private:
    int i;
    double d1;
    double d2;
    date da1;
    date da2;
    };
    A::A(int v1, const double& v2, const date& v3)
    : i(v1), d2(2*v2), da1(v3), da2()
    {
    }
    

    Ich verstehe nicht, welcher Konstruktor bei i(v1) oder d2(2*v2) aufgerufen wird? Ich gehe davon aus, dass es der selbe ist, wie wenn ich

    int i = typ(v1);
    

    schreiben würde. Ist das korrekt?
    Wo kann man sich die Definition des Typs int oder double anschauen, um herauszufinden welche Konstruktoren für diese Typen existieren? In der Cpp-Referenz konnte ich nichts dazu finden.

    mfG

    uncle bens



  • Die "einfachen" eingebauten Typen wie int, float, double haben keinen Konstruktor im eigentlichen Sinne, daher kannst du die auch nicht nachgucken. Was soll man bei diesen zahlartigen Typen auch anderes machen können als einen Wert zuweisen?

    Folgendes ist identisch:

    int i(42);
    int i {42};
    int i = 42;
    

    (wobei bei den geschwungenen Klammern zusätzlich sichergestellt wird, dass der Wert auch in den Zieltyp passt)

    Siehe auch http://en.cppreference.com/w/cpp/language/direct_initialization



  • nicht-class Typen haben keinen Konstruktor. Und das hier ist einfach nur "direct initialization".

    PS: Versuch, dir die Initialisierung mittels {} anzugwöhnen: variable{}
    Das geht auch in der Initialisierungsliste.



  • Danke für eure Antworten.
    Aber laut der cpp-Quelle scheint es sich ja durchaus um einen Konstruktor zu handeln: "Initializes an object from explicit set of constructor arguments."

    Aber ich denke ich verstehe, was gemeint ist, wenn ihr sagt, es ist kein Konstruktor im eigentlichen Sinne, da es sich bei int und double nicht um eine typische Klasse handelt.

    mfG

    uncle bens



  • uncle bens schrieb:

    Aber laut der cpp-Quelle scheint es sich ja durchaus um einen Konstruktor zu handeln: "Initializes an object from explicit set of constructor arguments."

    cppreference.com ist hier in der Wortwahl etwas zu speziell. Der Standard nennt dieses "set of constructor arguments" schlicht initializer(s).

    uncle bens schrieb:

    Aber ich denke ich verstehe, was gemeint ist, wenn ihr sagt, es ist kein Konstruktor im eigentlichen Sinne, da es sich bei int und double nicht um eine typische Klasse handelt.

    Ein int ist garkeine Klasse, nichmal eine atypische. Dub di dub.


Anmelden zum Antworten