static und const?



  • warum spuckt der Compiler bei folgendem Code eine Fehlermeldung aus?

    class Math
    {
     public:
      static long long fak(long long n) const
      {
       long long fak = 1;
       while(n > 1)
       {
        fak *= n;
        n--;
       }
       return fak;
      }
    };
    

    fak verändert ja keine Datenelemente - daher dachte ich mir es als const zu
    deklarieren - warum kann ich eine statische Methode nicht einfach als const
    deklarieren?



  • Was isn "long long" für ein Datentyp?



  • Vertexwahn schrieb:

    warum kann ich eine statische Methode nicht einfach als const
    deklarieren?

    Weil es sinnlos ist. const-Methoden können nur für const-Objekte aufgerufen werden. Statische Methoden werden ohne Objekt aufgerufen.



  • Aber Statische Methoden können Klassenvariablen verändern - dann würde ein const schon sinn machen - oder wie kann ich dafür sorgen, dass man von außen erkennt, das eine static Methode nichts an Klassenvariablen verändert?

    PS: long long ist ein datentyp für große Integerwerte (ist der noch nicht im C++ Standard eingeführt? - jedenfalls kennt C diesen Datentyp)



  • Vertexwahn schrieb:

    Aber Statische Methoden können Klassenvariablen verändern - dann würde ein const schon sinn machen - oder wie kann ich dafür sorgen, dass man von außen erkennt, das eine static Methode nichts an Klassenvariablen verändert?

    nein, sie können nur statische klassen variablen ändern, das ist aber nicht der punkt. der punkt ist, dass statische methoden nicht als methoden sondern als normale funktionen zählen(dh der klassenname ist dann nurnoch ein namespace ersatz), deshalb können sie nicht const sein.

    der nächste punkt ist, dass const objektgebunden ist, da statische methoden dies nicht sind, würden änderungen für const/nonconst objekte gleichermaßen gelten.



  • Wenn eine Methode das Attribut const erhält heißt das nur, das this const ist. Dadurch kann die Methode auch auf konstanten Objekten aufgerufen werden.


  • Mod

    Helium schrieb:

    Wenn eine Methode das Attribut const erhält heißt das nur, das this const ist. Dadurch kann die Methode auch auf konstanten Objekten aufgerufen werden.

    this ist immer const. *this ist es nicht unbedingt 😉



  • nein, sie können nur statische klassen variablen ändern

    wie kann ich das verhindern?



  • Vertexwahn schrieb:

    nein, sie können nur statische klassen variablen ändern

    wie kann ich das verhindern?

    Gar nicht! Es gibt eventuell gar kein Objekt von deiner Klasse, trotzdem kannst du die Methode aufrufen. Was soll dann verändert werden? Was wenn 5 Objekte von deiner Klasse vorhanden sind. Danach wird eine statische Methode aufgerufen um ein nicht-statisches Attribut auszulesen, von welchem der 5 Objekte soll es denn nun den Wert benützen?

    MfG SideWinder



  • Vertexwahn schrieb:

    nein, sie können nur statische klassen variablen ändern

    wie kann ich das verhindern?

    Mach die Klasse const!!1 🤡 😃 👍

    Ernsthaft: welchen Sinn könnte das haben? Wie sollte das funktionieren? In welchem Kontext sollten Methoden statische Variablen ändern Können?
    Und vor allem: wenn du nicht willst dass die Methode die du schreibst, in deiner Klasse auf deine statischen Member schreibend zugreift dann lass es einfach 😉



  • in deiner Klasse auf deine statischen Member schreibend zugreift dann lass es einfach

    dachte für sowas gibt es syntaktische mittel... ok dann merk ich es mir halt


Anmelden zum Antworten