wofür ist initialierungslist gut



  • wenn ich initialierungliste verwende, dann kann ich z.B. baseclass member initialisieren, ohne dafür eine Instanz zu erzeugen, etwa so:

    CDerivedClass::CDerivedClass
    :CBaseClass(1, 2) //init baseclass's member
    {
      //without CBaseClass* b = new CBaseClass(1,2)
    }
    

    aber wenn es gibt gar keine member in Base Class, ich brauch nur member in der abgeleitete Klasse zu initialieren (builtin type), dann

    CDerivedClass::CDerivedClass
    :i(0), j(0) //init baseclass's member
    {
    }
    

    ist gleich wie

    CDerivedClass::CDerivedClass
    {
       i = 0;
       j = 0;
    }
    

    ist die Aussage richtig?



  • aber wenn es gibt gar keine member in Base Class, ich brauch nur member in der abgeleitete Klasse zu initialieren (builtin type), dann

    Bitte gibt dir mehr Mühe bei der Forumulierung. Das liest sich wie ein Käsekuchen.

    Und Nein. Das ist nicht dasselbe. Da wird zuerst eine Initialisierung und dann eine Zuweisung durchgeführt.
    Probier mal eine Konstante in die Klasse zu nehmen. Dann geht das nicht mehr.



  • der compiler sieht wenn du

    CDerivedClass::CDerivedClass() 
    { 
       i = 0; 
       j = 0; 
    }
    

    schreibst folgendes:

    CDerivedClass::CDerivedClass()
    : CBaseClass(), i(0), j(0)
    { 
       i = 0; 
       j = 0; 
    }
    


  • drakon schrieb:

    Bitte gibt dir mehr Mühe bei der Forumulierung. Das liest sich wie ein Käsekuchen.

    Ich würde wetten, dass Deutsch nicht seine Muttersprache ist. Spar dir doch deine hilfreichen Hinweise lieber für die echten Deppen auf, die keinen vernünftigen Satz in ihrer eigenen Sprache zusammenbringen. Gibt ja genug davon hier.



  • grmlfx schrieb:

    drakon schrieb:

    Bitte gibt dir mehr Mühe bei der Forumulierung. Das liest sich wie ein Käsekuchen.

    Ich würde wetten, dass Deutsch nicht seine Muttersprache ist. Spar dir doch deine hilfreichen Hinweise lieber für die echten Deppen auf, die keinen vernünftigen Satz in ihrer eigenen Sprache zusammenbringen. Gibt ja genug davon hier.

    Das habe ich mir auch gedacht, aber das ist kein Grund sich nicht Mühe zu geben.
    Und ich mache das nicht, weil ich mich über jemanden Lustig machen will, sondern weil ich wirklich Mühe hatte die Frage zu verstehen, wenn es so wirr forumliert ist und wenn er hier öfters postet, dann ist das Wichtig für alle Beteiligten, wenn er lernt besseres Deutsch zu schreiben. Zumindest Satzstellung usw, sollten stimmen, dass man ohne Mühe den Text lesen kann und dann weiss, was er will.



  • blablabla deutschkenntnisse

    es geht hier um den unterschied zwischen init liste und initialisieren im CTor

    es ist so:

    wenn du im CTor initialisierst macht dein computer ungefähr folgendes (stimmt nur von prinzip her, wie es umgesetzt ist ist ganz anders!)

    class foo
    {
        int a;   
    };
    
    foo::foo()
    {
       a = 0;
    }
    

    der compiler macht das quasi so:
    er sieht int a als zeiger auf einen int und im konstruktor erzeugt er den zeiger wie mit new, danach weist er ihm einen beliebigen startwert zu, und im CTor setzt du dann a = 0

    das verbraucht zeit

    per init liste überspringt er den beliebigen startwert und setzt die variable direkt auf 0

    ausserdem kann man per init lsit noch konstanten zuweisen

    class test 
    {
    public:
       test(int x);
       int const a;  // = 5 geht nicht!
    };
    
    test::test(int x)
     : a(x)          // klappt alles ist ok
    {
        a = x;       // geht nicht...
    }
    


  • er sieht int a als zeiger auf einen int und im konstruktor erzeugt er den zeiger wie mit new, danach weist er ihm einen beliebigen startwert zu, und im CTor setzt du dann a = 0
    das verbraucht zeit

    per init liste überspringt er den beliebigen startwert und setzt die variable direkt auf 0

    1. der Compiler muss hier keinen beliebigen Startwert zuweisen, der braucht nur die
    Zeit um den Platz zu allokieren(das gebe ich dir Recht, die Allokation kostet Zeit)
    2. wenn der Compiler macht wirklich einen Zeiger draus,(was der sowieso macht, egal ob per initlist od. in Ctor), dann ich sehe keinen Vorteil, weil die Zuweisung mit Default Wert wird nicht stattfinden.
    3. es sei denn,

    CDerivedClass::CDerivedClass()
    {
    }
    

    in diesem Moment der Ctor von Base Klass schon aufgerufen, Platz für i wird allokiert (Zeitverbrauch 1)
    dann in den geschleiften Klammern noch mal

    {
      i = 0; //assignment operation called (Zeitverbrach 2)
    }
    

    d.h. wenn ich per initlist die Werte initialisiere, dann spare ich eine assignment operation.



  • neind as war im übertragenden sinne gemeint

    was der compiler draus macht weis ich nicht

    aber ich sagte man kann das mit zeigern und dem dynamischen kram vergleichen...


Anmelden zum Antworten