const - const



  • Hi
    was ist der Unterschied zwischen

    const variable;  // Variable
    string toString() const; // ? const am Schluss ?
    const string& Waehrung() const; // 2 mal const ?
    

    Die Variable ist klar, die ist nicht änderbar.
    Anschliessend eine Funktion mit RW string mit Namen toString(), warum steht hier const am Schluss? Was hat das für eine Auswirkung. Vor allem, warum ist die Funktion const(ant)?
    Das dritte verwirrt mich dann völlig. Eine Konstante Funktion mit noch einmal const am Schluss.
    Nr. 2 + 3 sollen Prototypen aus einer Klasse sein die im Public-Bereich definiert sind. Hier verstehe ich das const nicht.
    Kann das einer erklären, in meinem Buch habe ich das jetzt 10 mal gelesen aber ich verstehe es nicht.
    Danke schön .....

    PS: Wo kann man sowas nachlesen, und zwar so das es auch erklärt wird und nicht nur hingeschrieben?



  • Hi,

    JimPanse schrieb:

    const variable;  // Variable
    string toString() const; // ? const am Schluss ?
    const string& Waehrung() const; // 2 mal const ?
    

    > const am Schluss? Was hat das für eine Auswirkung. Vor allem, warum ist die

    Das bedeutet das keine der Variablen in dieser Methode verändert werden (Klassenvariablen, locale Variablen)

    JimPanse schrieb:

    Das dritte verwirrt mich dann völlig. Eine Konstante Funktion mit noch einmal const am Schluss.

    diese Methode gibt eine konstante Referenz zurück desweiteren werden keine Variablen verändert.

    Das erste hast du richtig erkannt. 🙂

    MfG eViLiSSiMo



  • Das const nach einer Memberfunktion bedeutet, dass innerhalb dieser Funktion keine Klassenmember verändert werden dürfen, die nicht mit mutable gekenzeichnet wurden:

    class a {
      int i; //Membervariable
    public:
      a(int j) : i(j) { }
    
      int get() const { return i; } //hier wird nichts verändert
      void set(int j) { i=j; } //hier wird i verändert
    };
    
    int main() {
      const a a0(10);
      a0.set(100); //<-- ein Fehler, weil die Methode set nicht const ist,
                   //also darf sie nicht von einem konstanten Objekt aufgerufen werden
      a a1(10);
      a1.set(100); //<-- alles klar, weil a1 nicht konstant ist
    }
    

    http://tutorial.schornboeck.net/constmethode.htm und http://tutorial.schornboeck.net/konstanten.htm
    http://www.gotw.ca/gotw/006.htm



  • Wie schon gesagt:

    1: Eine konstante Variable
    2: Eine "konstante" Methode, bei der keine Attribute verändert werden dürfen
    3: Eine Methode (für dies außerdem 2: gilt), die etwas "konstantes" zurückliefert (in diesem Fall eine konst. Referenz), da lass dich mal nicht verwirren, alles, was hier VOR dem Funktionsnamen steht, gehört zum Rückgabetyp!



  • Danke für die Antworten, ich glaube mittlerweile verstehe ich es einigermassen.

    class a {
      int i; //Membervariable
    public:
      a(int j) : i(j) { }
    
      int get() const { return i; } //hier wird nichts verändert
    

    Das const hätte man ja hier nicht hinschreiben müssen, man macht es nur damit man sich ganz sicher ist das das was die Funktion aufruft auch nicht verändert wird (werden darf). Wenn ich hier anstatt return i; zb. i = j geschrieben hätte dann müsste mir der Compiler eine Fehlermeldung ausgeben. Sehe ich das richtig?
    Nun denn, heute Abend sitze ich wieder vor meinem Rechner, da habe ich einen Compiler.
    Aber ich glaube ich verstehe es nun. Übung macht den Meister aber es ist wichtig zu verstehen warum etwas so ist wie es ist.

    Bye und nochmals danke an alle.



  • eViLiSSiMo schrieb:

    Das bedeutet das keine der Variablen in dieser Methode verändert werden (Klassenvariablen, locale Variablen)
    MfG eViLiSSiMo

    😃 klar können locale variablen der methode verändert werden 🙄
    die methode kann nur keine attribute der klasse verändern die nicht mutable sind



  • JimPanse schrieb:

    int get() const { return i; } //hier wird nichts verändert
    

    Das const hätte man ja hier nicht hinschreiben müssen, man macht es nur damit man sich ganz sicher ist das das was die Funktion aufruft auch nicht verändert wird (werden darf).

    Nein. Das const bewirkt auch, dass man get auf eine const-Instanz von a aufrufen darf. Beispiel:

    const a instanz(42);
    cout << instanz.get();
    

    Das würde nicht gehen, wenn get nicht const deklariert wär.


Anmelden zum Antworten