const



  • Wer erklärt mir, wo hierbei die Unterschiede sind:

    Object* Foo();
    const Object* Foo();
    Object* Foo() const;
    const Object* Foo() const;
    

    Ich blicks nicht :(? Danke!



  • Ich gehe mal davon aus, daß das alles Methoden einer Klasse sind:

    class Bar
    {
    public:
      Object* Foo1();
      const Object* Foo2();
      Object* Foo3() const;
      const Object* Foo4() const;
    }
    

    Foo1() liefert ein änderbares Objekt zurück und ist in der Lage, this zu verändern.
    Foo2() liefert ein konstantes Objekt zurück.
    Foo3() liefert ein änderbares Objekt zurück, darf aber this nicht ändern.
    Foo4() kombiniert 2 und 3 (sowohl this als auch das Ergebnis sind konstant).



  • Const hinter einer Funktion bedeutet, dass die Funktion das Objekt zu dem sie gehört nicht verändert. Const vor dem Rückgabetyp Object bedeutet, dass das Objekt auf das der Zeiger verweist in der aufrufenden Funktion nicht verändert werden darf.
    Die beiden Sachen kann man kombinieren also ergibt sich daraus 2^2 Möglichkeiten. 😉

    P.S.: Man könnte auch noch den Zeiger const machen also sowas wie

    const Object * const Foo () const;
    

    (Rückgabewert konstanter Zeiger auf ein konstantes Objekt)



  • Stimmt meine Deutung dann so:

    Foo1() liefert ein änderbares Objekt zurück und ist in der Lage, this zu verändern.

    Man kann alles mit dem Objekt machen, löschen, werte verändern, methoden aufrufen usw.

    Foo2() liefert ein konstantes Objekt zurück.
    Man darf nichts ändern?

    Foo3() liefert ein änderbares Objekt zurück, darf aber this nicht ändern.
    Man darf das Objekt manipulieren, aber den Zeiger darauf nicht?

    Foo4() kombiniert 2 und 3 (sowohl this als auch das Ergebnis sind konstant).
    Man darf gar nix?



  • 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