Funktionen in Klassendefinition mit const ?



  • Hallo.
    Hätte mal eine Frage zu konstanten Funktionen in Klassen:
    Kennzeichnet man Funktionen, die Membervariablen der Klasse nicht verändern immer mit const oder lässt man dieses weg?

    class A
    {
      public:
        void PrintToFile(const std::string& file) const; // hier mit oder ohne const ?
    
      private:
        std::string m_text;
    };
    

    So weit ich das verstanden habe, kann es grundsätzlich ja auch weggelassen werden (wie z.B. bei dem string-Parameter der Funktion auch), nur verdeutlicht es eben, dass diese Funktion nichts verändert.

    Sollte man es also immer hinschreiben, wenn es passt, um die Funktion zu "markieren"?

    MfG
    Hundefutter



  • Würde ich zumindest immer so machen.
    Technisch gäbe es ja keinen Grund eine Funktion als const zu deklarieren.
    Dennoch sollte alles was const ist, auch als const gekennzeichnet werden.



  • Du kannst für konstante Objekt keine nicht konstanten Memberfunktionen aufrufen.
    Beispiel:

    struct A
    {
        int getVal() const { return 0; }
    };
    
    struct B
    {
        int getVal() { return 0; }
    };
    
    int main()
    {
        A const a;
        B const b;
    
        std::cout << a.getVal() << '\n'; //geht
        std::cout << b.getVal() << '\n'; //geht nicht
    
    }
    


  • Tachyon schrieb:

    Du kannst für konstante Objekt keine nicht konstanten Memberfunktionen aufrufen.

    Ah ok, das wusste ich auch noch nicht.

    Also werde es einfach mal so als Kennzeichnung machen, schadet ja nicht und so fällt immerhin sofort auf, wenn etwas konstant ist.

    MfG
    Hundefutter



  • Hundefutter schrieb:

    Tachyon schrieb:

    Du kannst für konstante Objekt keine nicht konstanten Memberfunktionen aufrufen.

    Ah ok, das wusste ich auch noch nicht.

    Also werde es einfach mal so als Kennzeichnung machen, schadet ja nicht und so fällt immerhin sofort auf, wenn etwas konstant ist.

    MfG
    Hundefutter

    Es gibt auch sehr konkrete Fälle, wo das wichtig ist. Genaugenommen ist das sogar elementar für "const-correctness".
    Beispiel:

    void myFunct(std::string const& str)
    {
       if(str.size() != crazyVarFromNowhere) //wuerde nicht gehen, wenn std::string::size() nicht const waere
       {
          //crazyCode
       }
    }
    

Log in to reply