code_Kommentar



  • STOP! schrieb:

    widersprecht ihr euch nicht selber?

    Nö, wieso?

    STOP! schrieb:

    Einerseits preist ihr volkard so an, andererseits sagt ihr, dass das was in seinem tutorial ist falsch ist?

    Erstens wird hier niemand angepriesen, und zweitens, wo ist da der Widerspruch? Schliesslich ist niemand perfekt.



  • MFK schrieb:

    5er1al schrieb:

    im gegenteil, eigentlich sollte man eingebaute typen im konstruktor, und nicht in der initialisiererliste initialisieren!

    Warum?

    weil man dann so schöne probleme mit konstanten membern bekommt 😃



  • Das Tückische ist übrigens die Initialisier-Reihenfolge, aber nur wenn man nicht weiss wonach sie sich richtet. Hier ein Beispiel:

    #include <iostream>
    
    using namespace std;
    
    class bar
    {
        public:
            bar(const char *s)      
            {
                cout << s << " ";
            }
    };
    
    class foo
    {
        public:
    		foo() : m_a("was"), m_b("soll"), m_c("das") {}
    
            //Das Folgende würde gar nicht funktionieren, denn bar hat keinen Parameterlosen Konstruktor.
    		//Dieser wird aber benötigt, weil die Member schon initialisiert werden, bevor der Code innerhalb 
    		//der Mengenklammern beginnt. Das heisst, wenn es einen Default-Konstruktor gäbe, würden die Member,
    		//im Konstruktor-Block zum zweiten Mal initialisiert werden. Es sei denn der Compiler würde 
    		//den Unsinn erkennen und optimieren.
    		//foo()
    		//{
    		//	m_a = bar("was");
    		//	m_b = bar("soll");
    		//	m_c = bar("das");
    		//}
    
        private:
            bar m_c,m_b,m_a;
    };
    
    int main()
    {
        foo f;
        cout << endl;
        cin.get();
    }
    


  • nillable schrieb:

    Das Tückische ist übrigens die Initialisier-Reihenfolge, aber nur wenn man nicht weiss wonach sie sich richtet.

    Moderne Compiler machen sowieso drauf aufmerksam, wenn die Reihenfolge nicht ok ist 😉



  • Blue-Tiger schrieb:

    Moderne Compiler machen sowieso drauf aufmerksam, wenn die Reihenfolge nicht ok ist

    Inwiefern und welche? Beim Übersetzen des Beispiels macht weder g++ 3.4.2 (MinGW) noch VC 7.1 auf irgendwas aufmerksam.
    Falls wir aneinander vorbeireden: das Tückische, das veranschaulicht werden sollte, ist, dass die Member nicht in der Reihenfolge initialisiert werden, in der man sie in der Initialisierungsliste aufführt, sondern in der Reihenfolge der Deklarationen.



  • =====> Bei elementaren Datentypen ist es *scheiss egal* was man macht, denn diese werden lokal nicht mit Standardwerten gefüllt. Bei Klassen jedoch sollte man es unbedingt machen da man ansonsten ein Konstruktoraufruf mehr hat.



  • FireFlow schrieb:

    =====> Bei elementaren Datentypen ist es *scheiss egal* was man macht, denn diese werden lokal nicht mit Standardwerten gefüllt.

    Es sei denn, man hat, wie otze schon andeutete, konstante Member.



  • FireFlow schrieb:

    Bei elementaren Datentypen ist es *scheiss egal* was man macht

    Eben nicht. Lies dir otze's Beitrag nachmal durch. 😉 Oder wie siehts zB mit Referenzen aus?



  • groovemaster schrieb:

    FireFlow schrieb:

    Bei elementaren Datentypen ist es *scheiss egal* was man macht

    Eben nicht. Lies dir otze's Beitrag nachmal durch. 😉 Oder wie siehts zB mit Referenzen aus?

    Ich meinte das ganz normale int var; Bei Referenken und const Typen siehts wieder anderst das stimmt.



  • na da hab ich ja was angerichtet! 🙄

    Aber warum sie eben tükscih ist wurde ja schon gesagt....!



  • nillable schrieb:

    Blue-Tiger schrieb:

    Moderne Compiler machen sowieso drauf aufmerksam, wenn die Reihenfolge nicht ok ist

    Inwiefern und welche? Beim Übersetzen des Beispiels macht weder g++ 3.4.2 (MinGW) noch VC 7.1 auf irgendwas aufmerksam.
    ...

    Nun, mein gcc macht mich darauf aufmerksam.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Nun, mein gcc macht mich darauf aufmerksam.

    Du hast Recht. Dev-C++ 4.9.9.2 compiliert natürlich nicht per default mit -Wall. Dies habe ich erstmal über Kommandozeile ausprobiert, und siehe da:

    g++ 3.4.2 schrieb:

    main.cpp: In constructor foo::foo()': main.cpp:20: warning:foo::m_a' will be initialized after
    main.cpp:20: warning: bar foo::m_b' main.cpp:17: warning: when initialized here main.cpp:20: warning:foo::m_b' will be initialized after
    main.cpp:20: warning: `bar foo::m_c'
    main.cpp:17: warning: when initialized here

    Anschließend habe ich im Dev-C++ im Menu Werkzeuge->Compiler Optionen im Reiter Compiler "Folgende Befehle beim Compiler-Aufruf hinzufügen:" aktiviert und dort -Wall eingetragen, so dass immer mit dieser Option compiliert wird.
    Vielen Dank für diesen Hinweis, virtuell Realisticer!

    Beim VC++ 7.1 hingegen gibt es auch beim höchsten Warning Level /W4 diesbezüglich keinerlei Warnungen.

    Ein Hoch auf g++! 👍


Anmelden zum Antworten