Was soll das "const" nach dem Namen einer Funktion?



  • Hallo,

    kann mir jemand sagen was das const nach dem Namen einer Funktion soll?
    Hab dazu im FAQ-Archiv nichts gefunden.

    z.B:

    void MyFunction() const {
      return;
    }
    


  • Das kann man benutzen, wenn die Funktion in einer Klasse steckt. Die Funktion darf dann keine der Variablen aus der Klasse verändern.

    class Himmel
    {
        public:
            double ZaehleEngel() const
            {
                // Engel = 5; würde nicht funktionieren, da die Methode/Funktion keine Variablen der Klasse verändern darf
                return Engel * Gott;
            }
    
        private:
            int Engel;
            double Gott;
    };
    


  • Hinter einer Funktion macht es keinen Sinn.
    Hinter einer Methode allerdings bedeutet es, dass die Methode das Objekt nicht verändert (also die Werte von Membervariablen werden nicht geändert).


  • Mod

    Airdamn schrieb:

    Hinter einer Funktion macht es keinen Sinn.
    Hinter einer Methode allerdings bedeutet es, dass die Methode das Objekt nicht verändert (also die Werte von Membervariablen werden nicht geändert).

    Eine "Methode" ist eine Funktion (Der Begriff Methode hat in C++ ohnehin keine eindeutige Bedeutung und ist insoweit bei der Diskussion von solchen technischen Details nutzlos).



  • Nun ich dachte allgemein wird unterschieden zwischen einer Methode (Klassenfunktion) und einer Funktion (allgemeine Funktion außerhalb von Klassen).

    Finde ich persönlich auch sinnvoll...



  • Danke für das gute Beispiel 😃

    PS:
    Methoden/ Funktionen/ Prozeduren sind genau das Gleiche, bloß werden die Namen von Programmiersprache zu Programmiersprache anders gewählt.
    in PureBasic heißt es Prozedur (also Procedure), in BlitzBasic heißt es Funktion (also Function), in Java spricht man von Methoden.
    Ich persönlich finde den Namen "Funktion" logischer da er auch aus der Mathematik eher bekannt ist.


  • Mod

    Es ist sicherlich nicht sinnlos, aber nicht eindeutig genug. Memberfunktionen können statisch und nicht-statisch sein. Und nicht-statische Memberfunktionen können zudem virtuell sein. Im ARM wird der Begriff einmal erwähnt:

    The Annotated C++ Reference Manual schrieb:

    Member functions are sometimes referred to as "methods." This terminology comes from Smalltalk, where calling a member function is referred to as "sending a message." This analogy is not exact because of the reliance on static type checking in C++; the analogy between methods and member functions is somewhat more accurate for virtual functions (§10.2). Similarly, the Smalltalk phrase "instance variable" is sometimes used to mean data member.

    Der Standard benutzt diesen Begriff dann nicht mehr, im TCPL taucht er einmal auf:

    The C++ Programming Language 3rd Edition schrieb:

    12.2.6 Virtual Functions
    [...]A virtual member function is sometimes called a method.

    Wir haben also bereits hier zwei miteinander unvereinbare Definitionen vom gleichen Autor.
    Bei anderen Autoren findet sich ähnliches: weder Meyers noch Sutter etwa benutzen den Begriff in C++ (wohl aber in Bezug auf Java oder C# - das ist also kein Zufall).

    In C++ ist es in der Regel möglich, eine bestimmte Funktion als freie oder als Memberfunktion zu implementieren - wenn wir z.B. den Begriff Methode für eine Funktion verwenden wollen, die mit oder auf einem Objekt operiert, dann sagt uns das folglich nicht, ob es sich um eine Memberfunktion handelt oder nicht. Mithin kann dieser Begriff im Entwurf nützlich sein, auf der Ebene der konkreten Sprache ist er es dagegen weniger.
    Natürlich sind wir in diesem Forum nicht so empfindlich, und für gewöhnlich kann man dem Kontext entnehmen, was ein Poster hier mit Methode meint - es schadet aber nicht, sich Gedanken bei der Begriffswahl zu machen.



  • So ziemlich jeden den ich kenne benutzt "Funktion" für eine globale Funktion und "Methode" für eine "Funktion" innerhalb einer Klasse.



  • Badestrand schrieb:

    Das kann man benutzen, wenn die Funktion in einer Klasse steckt. Die Funktion darf dann keine der Variablen aus der Klasse verändern.

    außer solchen, die als mutable deklariert wurden.



  • EWGF schrieb:

    So ziemlich jeden den ich kenne benutzt "Funktion" für eine globale Funktion und "Methode" für eine "Funktion" innerhalb einer Klasse.

    So ziemlich jeder, den ich kenne, müht sich mit "char*" ab, bevor er std::string kennenlernt. 😉

    Sagen wir mal so: Was camper hier sagt, ist für mich IMMER seeehr bedenkenswert....

    Gruß,

    Simon2.


Anmelden zum Antworten