Was der Modifikator const nach einer Methodendeklaration bedeutet

 

Eine Frage unter vier Augen gestellt, was bedeutet das? Ich habe im Forum ein hilfreiches Beispiel gefunden, das dies verdeutlicht.
Übrigens, wenn Sie Englisch sprechen, ist es sehr nützlich, solche Fragen auf Englisch zu googeln, nicht in MQL, sondern in C++. Z.B. so
http://www.google.com/search?q=const+in+c%2B%2B+nach+Funktion&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Es wird viele Links zu reinen Programmierforen geben, und C++ ist MQL sehr ähnlich.

Ich habe die Kommentare ins Russische übersetzt und einige Anpassungen für die MQL-Kompatibilität vorgenommen. Ich hänge das Skript unten an, kompilieren Sie es, und alles wird klar werden.

struct X
{
    void foo() const 
    {
        _x = 42; // ERROR! метод объявлен, как const, не можем менять члены 
        _y = 42; // ERROR! 
    }

    void bar(X& obj) const 
    {
        obj._x = 42; // OK! obj передается по ссылке и не имеет модификатора const
        _x = 42; // ERROR!
    }

    void bar(X const& obj) 
    {
        obj._x = 42; // ERROR! obj передается по ссылке, как const
        obj._y = 42; // ERROR! obj передается по ссылке, как const
        _x = 42; // OK! метод объявлен без const на сонце
    }

    int _x, _y;
};
Dateien:
TestConst.mq4  2 kb
 
Alexey Volchanskiy:

Ich habe unter vier Augen eine Frage gestellt, was das bedeutet. Eilte auf das Forum, um es zu beantworten, da ich ein nützliches Beispiel gefunden habe, das Klarheit bringt.
Übrigens, wenn Sie Englisch sprechen, ist es sehr nützlich, solche Fragen auf Englisch zu googeln, nicht in MQL, sondern in C++. Z.B. so
http://www.google.com/search?q=const+in+c%2B%2B+nach+Funktion&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Es wird viele Links zu reinen Programmierforen geben, und C++ ist MQL sehr ähnlich.

Ich habe die Kommentare ins Russische übersetzt und einige Anpassungen für die MQL-Kompatibilität vorgenommen. Ich hänge das Skript unten an, kompilieren Sie es einfach und alles wird klar.

Bringt die Dokumentation keine Klarheit?

Eine Methode mit dem Modifikatorconst wird als konstant bezeichnet und kann die impliziten Mitglieder ihrer Klasse nicht verändern. Die Deklaration von konstanten Klassenfunktionen und konstanten Parametern wird als const-correctnesscontrol bezeichnet. Mit dieser Kontrolle können Sie sicher sein, dass der Compiler unveränderte Werte von Objekten im Auge behält und im Falle eines Verstoßes bei der Kompilierung einen Fehler erzeugt.

Derconst-Modifikator sollte nach der Liste der Argumente innerhalb der Klassendeklaration platziert werden. Definitionen außerhalb einer Klasse sollten ebenfalls den Modifikatorconst enthalten:

Ein zusätzliches Argument für die Verwendung der Integritätskontrolle ist, dass der Compiler spezielle Optimierungen vornimmt, z. B. indem er ein persistentes Objekt in den Nur-Lese-Speicherstellt.

Einestatische Funktion kann nicht mit dem Modifikatorconstdefiniert werden, da dieser Modifikator garantiert, dass die Mitglieder der Instanz unverändert bleiben, wenn eine solche Funktion aufgerufen wird. Aber, wie bereits erwähnt, kann eine statische Funktion per Definition nicht auf nicht-statische Klassenmitglieder zugreifen.

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Außerdem haben Sie meiner Meinung nach nicht das gelungenste Beispiel für den Aufbau einer Struktur präsentiert (erst Methoden, dann Mitgliederdaten). Außerdem ist es besser, alles in eine Klasse statt in eine Struktur zu verpacken, da Strukturen in der Regel als eine Vereinigung von Daten (ohne Methoden) verwendet werden.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Kozitsyn:

Bringt die Dokumentation keine Klarheit?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Und meiner Meinung nach haben Sie nicht das beste Beispiel für den Aufbau einer Struktur geliefert (zuerst Methoden, dann Mitgliedsdaten). Außerdem ist es besser, alles in eine Klasse statt in eine Struktur zu verpacken, da Strukturen in der Regel als eine Vereinigung von Daten (ohne Methoden) verwendet werden.

Enthält

Ich erinnerte mich, dass es irgendwo in einem Dokument stand, aber ich konnte es nicht finden. Ich habe ein Beispiel von stackoverflow kopiert. Wo die Daten abgelegt werden, ist eine persönliche Angelegenheit des Programmierers, obwohl ich sie selbst an den Anfang gestellt habe. Ob man Strukturen oder Klassen verwendet, ist eine persönliche Angelegenheit des Programmierers )))

 
Alexey Volchanskiy:

Eingabe von

Ich erinnerte mich daran, dass es irgendwo in der Dokumentation stand, aber ich konnte es nicht finden. Ich habe ein kurzes Beispiel von Stackoverflow gestohlen. Es bleibt dem Programmierer überlassen, wo er die Daten einfügt, ich selbst habe sie an den Anfang gestellt. Ob man Strukturen oder Klassen verwendet, bleibt dem Programmierer überlassen ))))

Man kann über viele Dinge auf diese Weise "eine Privatangelegenheit" sagen. Aber Sie sind derjenige, der es jemandem erklärt, und zwar nicht persönlich, sondern öffentlich. Und Ihre "Privatangelegenheit" widerspricht einem guten Programmierstil. Und die Person, der Sie es erklären, und viele andere Benutzer können es für einen guten Stil halten, was es nicht ist.

Und über die Person, die den Kurs hier gewollt (oder vielleicht geleitet) hat, sagt ein solches "Bloop, bloop, bloop" eine Menge aus.

 
Метод с модификатором const wird als konstant bezeichnet und kann die impliziten Mitglieder seiner Klasse nicht verändern.
Welche Mitglieder sind explizit, welche sind implizit?
 
Dmitry Fedoseev:
Welche Mitglieder sind explizit, welche sind implizit?

In diesem Zusammenhang sind dies offenbar die Mitglieder, die die Methode aufrufen. Andernfalls handelt es sich um die Mitglieder, auf die von der Methode aus über diese zugegriffen werden kann.

 

In C++ bedeutet dies, dass eine Methode keine Klassenmitglieder ändern kann, mit Ausnahme der für veränderbar erklärten Mitglieder.

Da man dies in MQL kaum erwarten kann, bedeutet dies, dass eine Methode ein Objekt prinzipiell nicht verändern kann.

 
Комбинатор:

In C++ bedeutet dies, dass eine Methode keine Klassenmitglieder ändern kann, mit Ausnahme der für veränderbar erklärten Mitglieder.

Da man dies in MQL kaum erwarten kann, bedeutet dies, dass eine Methode ein Objekt prinzipiell nicht verändern kann.

Eine konstante Methode kann nicht nur das Objekt ändern, das sie aufgerufen hat. Wird jedoch ein anderes Objekt ohne den Modifikator const an die Methode übergeben, kann sie (die Methode) es durchaus erfolgreich ändern.
 
Alexey Kozitsyn:
Eine konstante Methode kann nicht nur das Objekt ändern, das sie aufgerufen hat.
Ist dies ein Versehen?
 
Alexey Volchanskiy:
Ist das ein Tippfehler?
Erklären Sie, was Sie damit meinen?
 
Diekonstante Methode ist ein weiteres Beispiel für das Sprichwort "Wir wollten es besser machen, aber es ist so gekommen, wie wir es immer machen". Ich denke, das ist ein Motto für C++ überhaupt. Es gibt keinen praktischen Nutzen, aber es erschwert den Entwurf von OOP-Programmen erheblich, weil man ständig den Typ des geänderten Objekts kontrollieren muss (muss auch konstant sein).