const Methode



  • Gutn Abnd

    Es gilt ja für "const"-Methoden einer Klasse folgendes:
    1. In const-Methoden können nicht Attribute der Klasse geändert werden.
    2. const-Methoden können nur andere const-Methoden, nicht aber normale Methoden, die die Attribute der Klasse ändern, aufrufen.
    Wenn ich nun von der const-Methode aus eine andere Methode der Klasse aufrufe, das ein Attribut der Klasse ändert, so bekomm ich ne Fehlermeldung. Soweit alles OK.
    Doch wenn ich aus der const-Methode die Funktion "memset()" aufrufe und damit dann ein Klassenattribut überschreibe, sagt der Compiler nichts.

    Wieso? Wieso schreit der Compiler nicht? memset() ist doch schließlich nicht "const".



  • Zeig mal den entsprechenden Code? memset() ist keine Methode, daher ist es weder const noch nicht const...



  • Ist das Attribut zufällig ein Zeiger auf einen Speicherblock, auf den du memset dann anwendest? Das geht, auch wenn der Zeiger konstant ist. Ein konstanter Zeiger ist nicht dasselbe wie ein Zeiger auf einen konstanten Speicherbereich 🙂

    Wie auch immer, her mit dem Code...



  • /rant/ schrieb:

    Ein konstanter Zeiger ist nicht dasselbe wie ein Zeiger auf einen konstanten Speicherbereich 🙂

    Genau, da liegt eben der Unterschied zwischen bitwise const und logical const...



  • Nur am Rande und eher ein Sonderfall, mit dem Schlüsselwort "mutable" kann man das Attribut auch in einer Const-Methode verändern. Anwendungsfall: Wenn hinter einer Const-Methode ein Cache-Mechanismus steckt. Soweit ich weiß ist Const auch nur ein Versprechen, und ein Versprechen muss nicht gehalten werden (siehe Sonderfall).

    class A {
    public:
      typedef std::vector< int > IntVector;
    public:
      A() : _biggestValue( _values.end() ) {}
    
      int getBiggestValue() const {
        if( _biggestValue != _values.end() ) {
          return *_biggestValue;
        }
    
        // ggf. gibt es hierfür eine STL Implementierung
        int biggestValue = std::numeric_limits< int >::min();
        for(IntVector::const_iterator itr = _values.begin(); itr != _values.end(); ++itr) {
         if( *itr > biggestValue ) {
           biggestValue = *itr;
           _biggestValue = itr;
         }
       } 
    
       return biggestValue;
      }
    
    private:
      IntVector _values;
      mutable IntVector::const_iterator _biggestValue;
    };
    


  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • dot schrieb:

    /rant/ schrieb:

    Ein konstanter Zeiger ist nicht dasselbe wie ein Zeiger auf einen konstanten Speicherbereich 🙂

    Genau, da liegt eben der Unterschied zwischen bitwise const und logical const...

    Wieso kommst du auf einmal darauf!? Das hat doch nichts mit Zeigerkonstanz zu tun... 😕



  • Zugegeben, das Zitat war zu knapp gewählt und liefert etwas zu wenig Kontext. Wenn du den Thread bis zu dem Posting ganz liest, wird hoffentlich klarer, was ich damit gemeint hab...


Log in to reply