Qué significa el modificador const después de una declaración de método

 

Hizo una pregunta en privado, ¿qué significa? He encontrado un ejemplo útil en el foro que ayuda a aclararlo.
Por cierto, si hablas inglés es muy útil buscar en Google esa pregunta en inglés, no en MQL, sino en C++. Por ejemplo, así
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Habrá muchos enlaces a foros de programación pura, y C++ es bastante similar a MQL

He traducido los comentarios al ruso y he hecho algunos ajustes para la compatibilidad con MQL. Te adjunto el script de abajo, compílalo y todo se aclarará.

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

Preguntado en privado qué significa esto. Me apresuré a responder en el foro, ya que encontré un ejemplo útil que aporta claridad.
Por cierto, si hablas inglés, es muy útil buscar esa pregunta en inglés, no en MQL, sino en C++. Por ejemplo, así
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Habrá muchos enlaces a foros de programación pura, y C++ es bastante similar a MQL

He traducido los comentarios al ruso y he hecho algunos ajustes para la compatibilidad con MQL. Te adjunto el script a continuación, sólo tienes que compilarlo y todo se aclarará.

¿La documentación no aporta ninguna claridad?

Un método con el modificadorconst se llama constante y no puede modificar los miembros implícitos de su clase. La declaración de funciones de clase constantes y de parámetros constantes se denominacontrol de corrección de const. Con este control puede estar seguro de que el compilador llevará la cuenta de los valores no modificados de los objetos y generará un error en la fase de compilación en caso de infracción.

El modificadorconst debe colocarse después de la lista de argumentos dentro de la declaración de la clase. La definición fuera de una clase también debe incluir el modificadorconst:

Un argumento adicional para utilizar el control de integridad es que el compilador realiza optimizaciones especiales, por ejemplo, colocar un objeto persistente en memoria de sólo lectura.

Unafunción estática no puede ser definida con el modificadorconst, porque este modificador garantiza que los miembros de la instancia permanecen sin cambios cuando dicha función es llamada. Pero, como se mencionó anteriormente, una función estática por definición no puede acceder a los miembros no estáticos de la clase.

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

Además, en mi opinión, no has presentado el ejemplo más acertado de confección de una estructura (primero los métodos y luego los datos de los miembros). Y, para ello, es mejor envolverlo todo en una clase y no en una estructura, ya que las estructuras suelen utilizarse como unión de datos (sin métodos).

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

¿La documentación no aclara las cosas?

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

Y en mi opinión, no proporcionaste el mejor ejemplo de cómo armar una estructura (primero los métodos y luego los datos de los miembros). Y, para ello, es mejor envolverlo todo en una clase y no en una estructura, ya que las estructuras suelen utilizarse como unión de datos (sin métodos).

Contiene

Recordé que estaba escrito en algún lugar en un documento, pero no pude encontrarlo. He copiado un ejemplo de stackoverflow. Dónde poner los datos es una cuestión personal del programador, aunque yo mismo los pongo al principio. El uso de estructuras o clases depende del programador )))

 
Alexey Volchanskiy:

Entrar en

Recordé que estaba escrito en alguna parte del documento, pero no lo encontré. He robado un ejemplo rápido de stackoverflow. Depende del programador dónde poner los datos, aunque yo mismo los pongo al principio. El uso de estructuras o clases depende del programador ))))

Se puede decir "un asunto privado" sobre muchas cosas de tal manera. Pero eres tú quien se lo explica a alguien y no en persona sino públicamente. Y su "asunto privado" contradice un buen estilo de programación. Y la persona a la que se lo explicas, y muchos otros usuarios pueden tomarlo como un buen estilo, que no lo es.

Y sobre la persona que quiso (o quizás dirigió) el curso aquí, semejante "bloop, bloop, bloop" dice mucho.

 
Метод с модификатором const se llama constante y no puede modificar los miembros implícitos de su clase.
¿Qué miembros son explícitos y cuáles implícitos?
 
Dmitry Fedoseev:
¿Qué miembros son explícitos y cuáles implícitos?

Aparentemente, en este contexto, estos son los miembros que llaman al método. O, de lo contrario, son los miembros a los que se puede acceder a través de este desde el método.

 

En C++, esto significa que un método no puede cambiar los miembros de la clase, excepto los miembros declarados mutables.

Como en MQL no se puede esperar esto, significa que un método no puede cambiar un objeto en principio.

 
Комбинатор:

En C++, esto significa que un método no puede cambiar los miembros de la clase, excepto los miembros declarados mutables.

En MQL, esto significa que un método no puede modificar un objeto en principio.

Un método constante no puede cambiar sólo el objeto que lo llamó. Pero si se pasa otro objeto al método sin el modificador const, éste (el método) puede cambiarlo con bastante éxito.
 
Alexey Kozitsyn:
Un método constante no puede cambiar sólo el objeto que lo llamó.
¿Es un descuido?
 
Alexey Volchanskiy:
¿Es una errata?
¿Explique lo que quiere decir con eso?
 
Elmétodo constante es otro ejemplo del proverbio "queríamos hacerlo mejor, pero siempre se hace mejor". Creo que este es un lema para C++ en absoluto. No tiene ninguna utilidad práctica, pero complica significativamente el diseño de los programas OOP, ya que constantemente hay que controlar el tipo de objeto modificado (también debe ser constante).
Razón de la queja: