const-correctness



  • moin moin!

    mir ist die const correctness noch etwas unklar...

    class A
    {
        int x;
        public:
            A() {x = 0;}
    
            void DoSomethingWithParam(A& Obj) const 
            {
                Obj.x = 10;
            }
            int GetState() const {return x;}
    };
    

    das ist mir klar: Methoden die den Zustand eines Objekts liefern, ohne ihn zu verändern, sollten const sein....
    Methoden die den logischen Zustand eines Objekts nicht ändern, sollten immer const sein. was meint der da mit logischen zustand?

    gelesen da: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=constcor#Answ

    n8



  • Durch das const wird NUR! verhindert, dass das Objekt über den this-Pointer verändert werden kann. also in dem fall das x 😉
    Das const verhindert aber NICHT!, dass das Objekt über eine andere Referenz verändert werden kann.

    sollte man sonst noch was zu const wissen?

    cu



  • Der logische Zustand ist der von außen sichtbare. Der physische hingegen ist die Repräsentation des Objektes auf Bit-Ebene. Es gibt Situationen, wo sich der physische Zustand ändern kann, der logische jedoch nicht. (z.B. irgendwelche internen Hilfsvariablen) Dann müssen trotzdem für const-Correctness diese Methoden const sein. Die interenen Hilfsvariablen definiert man hierfür mit dem Schlüsselwort mutable. Das sollte man allerdings nur mit sehr viel Bedacht einsetzen. Meist deutet es eher auf Designfehler hin, wenn man zu mutable greifen will (was nicht heißt, dass es nicht trotzdem nützlich und sinnvoll ist).

    Zu deinem zweiten Post... solcher Code wie dieser hier ist illegal und nicht standardkonform:

    char a[10];
    {
      const char*& b( a);
      ... ///< änder a irgendwie hier
    }
    

    Während der Lebenszeit von b ist es verboten, a zu ändern. Anderernfalls ist es kein "wohlgeformtes C++-Programm"


Anmelden zum Antworten