const bei function returns und parametern



  • Hallo,

    ich bin fleißig am C++ lernen und dachte, dass mit dem Const hätte ich jetzt einigermaßen auf die Reihe gekriegt, allerdings bin ich von einem Buch, dass die SFML erklärt total verwirrt worden.

    Ich versuche also wiederzugeben, wie ich const bis jetzt verstanden habe und ihr sagt mir dann hoffentlich ob ich richtig liege.

    1. const int * alpha;
    - Pointer auf ein const int. Der Wert des Ints kann nicht verändert werden aber dem Pointer kann eine andere Speicheradresse zugewiesen werden.
    2. int * const alpha;
    - konstanter pointer auf ein Int. Der Wert (das int) auf die der Pointer zeigt kann verändert werden aber dem Pointer kann keine andere Adresse zugewiesen werden.

    3. const int * const alpha;
    - Konstanter Pointer auf ein konstantes Int. Kein Wert kann verändert werden.

    Ist das richtig?

    Was mich in dem Buch vollkommen verwirrt hat sind solche Funktionsdeklarationen:

    virtual void drawCurrent(sf::RenderTarget &  target, sf::RenderStates states)const;
    

    Auf was bezieht sich denn hier const?
    Kann es sein, dass sich Const auf die zwei Parameter bezieht und wenn ja was ist denn da denn jetzt alles const? Alles?



  • verwirrt schrieb:

    Was mich in dem Buch vollkommen verwirrt hat sind solche Funktionsdeklarationen:

    virtual void drawCurrent(sf::RenderTarget &  target, sf::RenderStates states)const;
    

    Auf was bezieht sich denn hier const?
    Kann es sein, dass sich Const auf die zwei Parameter bezieht und wenn ja was ist denn da denn jetzt alles const? Alles?

    Das const da bezieht sich einfach auf this. this wird ja unsichtbar übergeben, also wohin das const schreiben? da hinten war noch platz.



  • volkard schrieb:

    Das const da bezieht sich einfach auf this. this wird ja unsichtbar übergeben, also wohin das const schreiben? da hinten war noch platz.

    Entschuldige, bitte das verstehe ich nicht.

    Was hat dieses const denn jetzt für Auswirkungen?
    Ich habe so etwas bis jetzt noch nirgendswo gesehen.



  • Oder einfach gesagt. Wenn eine (Member)-Funktion das "const" hinten hat, darf es das Objekt nicht verändern:

    class A
    {
        int m;
    public:
    
        void a() const { m = 1; } // Fehler: Funktion darf Objekt nicht verändern!
        void b() { m = 1; }       // OK
    
        void c() { std::cout<<"hallo"; }
        void d() { std::cout<<"hallo"; }
    
    }
    
    int main()
    {
        const A a;
    
        a.c(); // Fehler: Funktion c KÖNNTE das Object verändern, aber "a" ist const!
        a.d(); // OK. "d" kann das Object nicht verändern
    }
    


  • Sag mir vorher, was this ist. Dann sag mir, was wäre, wenn *this const wäre, also was man dann alles nicht mehr verändern dürfte.



  • nach der Deklaration von "d" gehört natürlich ein const....



  • volkard schrieb:

    Sag mir vorher, was this ist. Dann sag mir, was wäre, wenn *this const wäre, also was man dann alles nicht mehr verändern dürfte.

    Ah, jetzt fällt der Groschen.

    this ist ein Pointer auf das current object.

    Das bedeutet ich kann innerhalb der Funktion keine member variablen des momentanen Objektes verändern.

    Interessant ich wusste nicht, dass das überhaupt geht.
    Werde ich in Zukunft auch verwenden.



  • Eine normale Memberfunktion kann man sich so vorstellen:

    ReturnType foo(T * const this, Args...)
    {
      ...
    }
    

    Sie erhält this als Typ konstanter Pointer auf die Klasse T.
    Eine Memberfunktion mit const, erhält dann:

    ReturnType foo(const T * const this, Args...)
    {
      ...
    }
    

    this ist nun ein Pointer auf ein konstantes T.
    (Little known fun fact: Dasselbe gilt auch für volatile hinter einer Memberfunktion).


  • Mod

    Little known fun fact

    "Little known" würde ich nicht meinen, dass const und volatile stets Hand in Hand gehen wissen doch die meisten.

    Das bedeutet ich kann innerhalb der Funktion keine member variablen des momentanen Objektes verändern.

    Doch, einige schon. Nämlich die die mit mutable deklariert wurden.

    struct A
    {
        mutable int i;
        int j;
    
        void f() const
        {
            i = 4; // In Ordnung
            j = 4; // Fehler
        }
    };
    


  • Arcoth schrieb:

    Little known fun fact

    "Little known" würde ich nicht meinen, dass const und volatile stets Hand in Hand gehen wissen doch die meisten.

    Ja, aber wer verwendet schon volatile oder kommt auf die Idee, dass bei einer Memberfunktion auszuprobieren. Garantiert die wenigsten Programmierer.
    Ich weiß das nur, weil ich mir aufmerksam die Referenz von atomic durchgelesen habe.


Log in to reply