Ce que signifie le modificateur const après une déclaration de méthode

 

Une question posée en privé, qu'est-ce que cela signifie ? J'ai trouvé un exemple utile sur le forum qui permet de le clarifier.
À propos, si vous parlez anglais, il est très utile de chercher une telle question sur Google en anglais, non pas en MQL, mais en C++. Par exemple, comme ceci
http://www.google.com/search?q=const+in+c%2B%2B+après+fonction&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Il y aura beaucoup de liens vers des forums de programmation pure, et le C++ est assez similaire au MQL.

J'ai traduit les commentaires en russe et fait quelques ajustements pour la compatibilité MQL. Je joins le script ci-dessous, compilez-le et tout deviendra clair.

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;
};
Dossiers :
TestConst.mq4  2 kb
 
Alexey Volchanskiy:

J'ai demandé en privé ce que cela signifie. Je me suis précipité sur le forum pour y répondre, car j'ai trouvé un exemple utile qui apporte de la clarté.
À propos, si vous parlez anglais, il est très utile de chercher une telle question sur Google en anglais, non pas en MQL, mais en C++. Par exemple, comme ceci
http://www.google.com/search?q=const+in+c%2B%2B+après+fonction&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Il y aura beaucoup de liens vers des forums de programmation pure, et le C++ est assez similaire au MQL.

J'ai traduit les commentaires en russe et fait quelques ajustements pour la compatibilité MQL. Je joins le script ci-dessous. Il suffit de le compiler et tout deviendra clair.

La documentation n'apporte pas de clarté ?

Une méthode avec le modificateurconst est dite constante et ne peut pas modifier les membres implicites de sa classe. La déclaration de fonctions de classe constantes et de paramètres constants est appeléecontrôle de const-correctness. Grâce à ce contrôle, vous pouvez être sûr que le compilateur gardera la trace des valeurs inchangées des objets et générera une erreur lors de la compilation en cas d'infraction.

Le modificateurconst doit être placé après la liste des arguments dans la déclaration de la classe. La définition en dehors d'une classe doit également inclure le modificateurconst:

Un argument supplémentaire pour l'utilisation du contrôle d'intégrité est que le compilateur effectue des optimisations spéciales, par exemple en plaçant un objet persistant dans une mémoire en lecture seule.

Unefonction statique ne peut pas être définie avec le modificateurconst, car ce modificateur garantit que les membres de l'instance restent inchangés lorsque cette fonction est appelée. Mais, comme mentionné ci-dessus, une fonction statique ne peut par définition pas accéder aux membres non statiques de la classe.

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

De plus, à mon avis, vous n'avez pas présenté l'exemple le plus réussi de constitution d'une structure (d'abord les méthodes, puis les données des membres). Et, d'ailleurs, il est préférable d'envelopper le tout dans une classe plutôt que dans une structure, puisque les structures sont généralement utilisées comme union de données (sans méthodes).

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

La documentation ne clarifie-t-elle pas les choses ?

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

Et à mon avis, vous n'avez pas fourni le meilleur exemple de mise en place d'une structure (d'abord les méthodes, puis les données des membres). Et, d'ailleurs, il est préférable d'envelopper le tout dans une classe plutôt que dans une structure, puisque les structures sont généralement utilisées comme union de données (sans méthodes).

Contient

Je me suis souvenu que c'était écrit quelque part dans un document, mais je ne l'ai pas trouvé. J'ai copié un exemple de stackoverflow. L'endroit où placer les données est une affaire personnelle du programmeur, bien que je les place moi-même au début. L'utilisation de structures ou de classes est du ressort du programmeur ;)))

 
Alexey Volchanskiy:

Entrer sur

Je me suis souvenu que c'était écrit quelque part dans le document, mais je n'ai pas pu le trouver sur place. J'ai volé un exemple rapide sur stackoverflow. C'est au programmeur de décider où placer les données, mais je les ai moi-même placées au début. Le choix d'utiliser des structures ou des classes est du ressort du programmeur )))).

Vous pouvez dire "une affaire privée" à propos de beaucoup de choses de cette manière. Mais c'est vous qui l'expliquez à quelqu'un et pas en personne mais publiquement. Et votre "affaire privée" est en contradiction avec un bon style de programmation. Et la personne à qui vous l'expliquez, ainsi que de nombreux autres utilisateurs peuvent le prendre comme un bon style, ce qui n'est pas le cas.

Et à propos de la personne qui a voulu (ou peut-être dirigé) le cours ici, un tel "bloop, bloop, bloop" en dit long.

 
Метод с модификатором const est appelé constant et ne peut pas modifier les membres implicites de sa classe.
Quels membres sont explicites, quels membres sont implicites ?
 
Dmitry Fedoseev:
Quels membres sont explicites, quels membres sont implicites ?

Apparemment, dans ce contexte, ce sont les membres qui appellent la méthode. Ou, sinon, il s'agit des membres auxquels on peut accéder par ce biais depuis la méthode.

 

En C++, cela signifie qu'une méthode ne peut pas modifier les membres de la classe, à l'exception des membres déclarés mutables.

Comme en MQL on ne peut guère s'attendre à cela, cela signifie qu'une méthode ne peut en principe pas modifier un objet.

 
Комбинатор:

En C++, cela signifie qu'une méthode ne peut pas modifier les membres de la classe, à l'exception des membres déclarés mutables.

En MQL, cela signifie qu'une méthode ne peut en principe pas modifier un objet.

Une méthode constante ne peut pas modifier uniquement l'objet qui l'a appelée. Mais si un autre objet est passé à la méthode sans le modificateur const, elle (la méthode) peut le modifier avec succès.
 
Alexey Kozitsyn:
Une méthode constante ne peut pas modifier uniquement l'objet qui l'a appelée.
Est-ce un oubli ?
 
Alexey Volchanskiy:
C'est une faute de frappe ?
Expliquez ce que vous entendez par là.
 
Laméthode constante est un autre exemple du proverbe "nous voulions faire mieux, mais il s'est avéré que nous faisons toujours la même chose". Je pense que c'est une devise pour le C++ tout court. Il n'y a pas d'utilité pratique, mais cela complique considérablement la conception des programmes OOP, parce que vous devez constamment contrôler le type d'objet modifié (qui doit aussi être constant).