Test(int i) : i(i) //hä?



  • Kann mir das bitte einer verständlich erklären? Danke.

    class Test
    {
    private:
      int i;
    public:
      Test(int i) : i(i) //hä?
      {}
    };
    


  • Das ist die Initialisierungsliste. Damit muss man z.B. Referenzen und Konstanten initialisieren. http://tutorial.schornboeck.net/initliste.htm

    Toni Schornböck: "Man sollte immer eine Initialisierungsliste verwenden, denn damit erspart man sich den Aufruf des Default Konstruktors. Dies kann einen großen Geschwindigkeitsvorteil bringen, denn es muss die Variable nicht erst mit sinnlosen Standardwerten gefüllt werden, sondern wir können gleich die richtigen Werte verwenden."

    Mir persönlich sagt dieser Stil mehr zu, damit man den Unterschied zwischen i_ und i besser erkennt:

    class Test
    {
      public:
        Test(int i) : i_(i){} // Initialisierungsliste
      private:  
        int i_;
    };
    


  • Falls dich lediglich das i(i) verwirren sollte.

    nennen wir es i1(i2)

    i1 muss eine Elementvariable (oder auch Elementfunktion) sein. Denn es steht in der Initliste. Und dort dürfen nur Elemente der Klasse stehen.

    i2 kann auch ein Element sein, aber auch ein Argument (dass übergeben wurde). Und das Argument hat die 'höhere Priorität' wenn man so sagen will. i2 überdeckt somit i1.

    Deshalb wäre ein
    i=i;
    im Ctor fehlerhaft, weil es beidemale i2 wäre (i2 hat ja höhere Priorität).
    this->i=i;
    wäre das Äquivalente.



  • @Shade Of Mine: Das nennst du verständlich erklären? 😉



  • Danke für eure Antworten.

    Damit ich das richtig verstehe:

    Wenn ich in der main

    Test a(3)

    schreiben würde, dann hieße das, das

    Test( 3 ) : i (3)

    sei, also i = 3? Der Doppelpunkt dazwischen bedeutet: alles was rechts vom Doppelpunkt steht, wird initialiert??



  • Hi,

    dann hieße das, das

    Test( 3 ) : i (3)

    sei, also i = 3? Der Doppelpunkt dazwischen bedeutet: alles was rechts vom Doppelpunkt steht, wird initialiert??

    Für den Aufruf gilt das, genau.
    Falls dir Freude am wahren Wort liegt übrigens: initialisiert

    MfG Eisflamme 🙂



  • Ein größeres Beispiel zeigt dir die Verwendung der Init-Liste auch bei mehreren Member-Variablen (hier konstante Geburtsdaten einer Person):

    #include <iostream>
    #include <iomanip>
    #include <conio.h>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    class Person
    {
      private:
        const unsigned d_;
        const unsigned m_;
        const unsigned y_;
    
      public:
        Person(unsigned d, unsigned m, unsigned y);
        const string getBirthday() const;
    };
    
    Person::Person(unsigned d, unsigned m, unsigned y):d_(d),m_(m),y_(y){}
    
    const string Person::getBirthday() const
    {
        stringstream sstream;
        sstream<<setfill('0')
        << setw(2) << d_ << "."
        << setw(2) << m_ << "."
        << setw(2) << y_ ;
        return sstream.str();
    }
    
    int main()
    {
        Person A(12,1,1953), B(3,11,1981);
        cout << A.getBirthday() << endl 
             << B.getBirthday() <<endl;
        getch();
    }
    


  • die initialisierer sollen auch in der reichenfolge geschrieben werden, wie die variablen deklariert wurden. sonst meckern einige compiler



  • bzw. das Problem ist dabei folgendes: Die Elemente werden leider in der Reihenfolge initialisiert, wie sie in der Klasse stehen und nicht, wie sie in der Liste dann stehen.

    Wenn ich b in Abhängigkeit von a initialisieren will, muss ich verflucht aufpassen, dass a auch wirklich zuerst initialisiert wird. Ich glaube, mein Compiler gibt da keine Warnung aus. 😞



  • Erhard Henkes schrieb:

    Ein größeres Beispiel zeigt dir die Verwendung der Init-Liste auch bei mehreren Member-Variablen (hier konstante Geburtsdaten einer Person):

    Ok, soweit habe ich das Bsp. verstanden.

    const string getBirthday() const;
    

    bedeutet das, dass getBirthday() einen konstanten String zurückliefert, aber was bewirkt das zweite const??



  • Das ist ne Garantie dafür, dass diese Methode nix an dem Objekt verändert.



  • Optimizer schrieb:

    bzw. das Problem ist dabei folgendes: Die Elemente werden leider in der Reihenfolge initialisiert, wie sie in der Klasse stehen und nicht, wie sie in der Liste dann stehen.

    Wenn ich b in Abhängigkeit von a initialisieren will, muss ich verflucht aufpassen, dass a auch wirklich zuerst initialisiert wird. Ich glaube, mein Compiler gibt da keine Warnung aus. 😞

    Der gcc meldet folgendes:
    Warning: 'Foo::Bar' will be initialized after `int Foo::Bar2'


Anmelden zum Antworten