const



  • Das übergebene Objekt kannst du auf jeden Fall lesen. Im Fall 1 und 3 kannst du es zusätzlich auch ändern. das "const" hinter der Parameterliste legt fest, wie das Objekt gesehen wird, das die Methode aufruft (bei "y=x.Foo();" also x) - wenn das als const definiert ist, kannst du davon ausgehen, daß das Objekt so bleibt, wie es ist.

    Bar x;Objekt* o;
    o=x.Foo1();//könnte x verändern
    o=x.Foo3();//x bleibt unverändert
    


  • Also ich hab nun alle geschnallt (durch versuche), aber ich finde keinen unterschied zwischen 1 und 3. Was meinst du mit "der this zeiger ist bei 3 const"?



  • Wie schon gesagt das const hinter der Funktion bezieht sich auf das Objekt.

    Beispiel:

    ..
    MeinObjekt.test ();
    ..
    

    Wenn test () so deklariert ist:

    ...
    void test () const;
    ...
    

    besagt das const, dass der aufruf von test () MeinObjekt nicht verändert.



  • Mathias schrieb:

    Wie schon gesagt das const hinter der Funktion bezieht sich auf das Objekt.

    Beispiel:

    ..
    MeinObjekt.test ();
    ..
    

    Wenn test () so deklariert ist:

    ...
    void test () const;
    ...
    

    besagt das const, dass der aufruf von test () MeinObjekt nicht verändert.

    dann geht z.B. das nicht

    void Klasse::test() const
    {
        this->irgendEinMember = irgendwas; // da der Breich auf den der this Zeiger zeigt verändert würde
    }
    


  • Bingo

    (Ausnahme jemand war "böse" und hat die betreffende Variable mutable gemacht. Dann geht das plötzlich wieder. Ist z.B. für abgeleitete Attribute sinnvoll, also für Puffer-Variablen.)



  • des is alles möglich ( nur bei const ) :p

    struct Object{
          Object *       Foo1()      {}
    const Object *       Foo2()      {}
          Object *       Foo3() const{}
    const Object *       Foo4() const{}
          Object * const Foo5()      {}
    const Object * const Foo6()      {}
          Object * const Foo7() const{}
    const Object * const Foo8() const{}
    };
    


  • const Fädischiesst schrieb:

    des is alles möglich ( nur bei const ) :p

    struct Object{
          Object *       Foo1()      {}
    const Object *       Foo2()      {}
          Object *       Foo3() const{}
    const Object *       Foo4() const{}
          Object * const Foo5()      {}
    const Object * const Foo6()      {}
          Object * const Foo7() const{}
    const Object * const Foo8() const{}
    };
    

    net zu vergessen das man das const vone auch noch wo anders hinstelen kann 😉

    struct Object{
    Object       *       Foo1()      {}
    Object const *       Foo2()      {}
    Object       *       Foo3() const{}
    Object const *       Foo4() const{}
    Object       * const Foo5()      {}
    Object const * const Foo6()      {}
    Object       * const Foo7() const{}
    Object const * const Foo8() const{}
    };
    

  • Mod

    einen konstanten pointer statt eines nicht-konstanten pointers zurückzugeben ist vollkommen sinnlos. beides sind rvalues und daher sowieso nicht veränderbar.



  • Ging auch nicht darum was man damit sinnvolles anstellen kann, sondern darum zu zeigen welche Varianten mit const es gibt.
    (Spielt doch keine Rolle ob man das erst bei den Übergabeparametern anspricht oder bei den Rückgabeparametern, hauptsache man hat verstanden wie es funktioniert.)
    😉



  • const Fädischiesst schrieb:

    des is alles möglich ( nur bei const ) :p

    struct Object{
          Object *       Foo1()      {}
    const Object *       Foo2()      {}
          Object *       Foo3() const{}
    const Object *       Foo4() const{}
          Object * const Foo5()      {}
    const Object * const Foo6()      {}
          Object * const Foo7() const{}
    const Object * const Foo8() const{}
    };
    

    So und jetzt bitte noch volatile. 🙂



  • Auja, mach uns klüger groovemaster. :p


Anmelden zum Antworten