O que significa o modificador constante após uma declaração de método

 

Fez uma pergunta em particular, o que isso significa. Encontrei um exemplo útil no fórum que ajuda a esclarecê-lo.
A propósito, se você fala inglês, é muito útil para o Google tal pergunta em inglês, não em MQL, mas em C++. Por exemplo, como este
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Haverá muitos links para fóruns de programação pura, e C++ é bastante similar ao MQL

Traduzi os comentários para o russo e fiz alguns ajustes para compatibilidade com MQL. Estou anexando o roteiro abaixo, compilando-o e tudo se tornará claro.

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

Fizeram uma pergunta em particular sobre o que isto significa. Apressei-me no fórum para respondê-lo, pois encontrei um exemplo útil que traz clareza.
A propósito, se você fala inglês, é muito útil para o Google tal pergunta em inglês, não em MQL, mas em C++. Por exemplo, como este
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Haverá muitos links para fóruns de programação pura, e C++ é bastante similar ao MQL

Traduzi os comentários para o russo e fiz alguns ajustes para compatibilidade com MQL. Estou anexando o roteiro abaixo. Basta compilá-lo e tudo se tornará claro.

A documentação não traz alguma clareza?

Um método com o modificadorconstante é chamado de constante e não pode modificar os membros implícitos de sua classe. A declaração de funções de classe constantes e parâmetros constantes é chamada decontrole de constância-correção. Com este controle, você pode ter certeza de que o compilador manterá o controle dos valores inalterados dos objetos e gerará um erro na fase de compilação em caso de violação.

O modificadorconstante deve ser colocado após a lista de argumentos dentro da declaração de classe. A definição fora de uma classe também deve incluir o modificador deconstância:

Um argumento adicional para o uso do controle de integridade é que o compilador faz otimizações especiais, por exemplo, colocando um objeto persistente na memória somente de leitura.

Umafunção estática não pode ser definida com o modificadorconstante, porque este modificador garante que os membros da instância permaneçam inalterados quando tal função é chamada. Mas, como mencionado acima, uma função estática, por definição, não pode acessar membros de classe não estáticos.

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

Além disso, na minha opinião, você não apresentou o exemplo mais bem sucedido de composição de uma estrutura (primeiro os métodos, depois os dados dos membros). E, por isso, é melhor envolver tudo em uma classe do que em uma estrutura, uma vez que as estruturas são geralmente usadas como uma união de dados (sem métodos).

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

A documentação não esclarece as coisas?

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

E na minha opinião, você não forneceu o melhor exemplo de como montar uma estrutura (primeiro os métodos, depois os dados dos membros). E, por isso, é melhor envolver tudo em uma classe do que em uma estrutura, uma vez que as estruturas são geralmente usadas como uma união de dados (sem métodos).

Contém

Eu me lembrei que estava escrito em algum lugar em um documento, mas não consegui encontrá-lo. Eu copiei um exemplo do stackoverflow. Onde colocar os dados é um assunto pessoal do programador, embora eu mesmo os tenha colocado no início. Se usar estruturas ou classes é um assunto pessoal para o programador )))

 
Alexey Volchanskiy:

Entrando em

Lembrei que estava escrito em algum lugar no documento, mas não consegui encontrá-lo. Roubei um exemplo rápido do stackoverflow. Cabe ao programador onde colocar os dados, embora eu mesmo os tenha colocado no início. A utilização de estruturas ou classes fica a cargo do programador ))))

Você pode dizer "um assunto particular" sobre muitas coisas de tal maneira. Mas é você quem está explicando isso a alguém e não pessoalmente, mas publicamente. E seu "caso particular" contradiz um bom estilo de programação. E a pessoa a quem você está explicando, e muitos outros usuários podem tomar isso como um bom estilo, o que não é.

E sobre a pessoa que queria (ou talvez liderasse) o curso aqui, um tal "bloop, bloop, bloop" diz muito.

 
Метод с модификатором const é chamada constante e não pode modificar os membros implícitos de sua classe.
Quais membros são explícitos, quais estão implícitos?
 
Dmitry Fedoseev:
Quais membros são explícitos, quais estão implícitos?

Aparentemente, neste contexto, estes são os membros que chamam o método. Ou, caso contrário, eles são os membros que podem ser acessados através deste método.

 

Em C++, isto significa que um método não pode mudar os membros da classe, exceto para os membros declarados mutáveis.

Como na MQL dificilmente se pode esperar isto, isto significa que um método não pode mudar um objeto em princípio.

 
Комбинатор:

Em C++, isto significa que um método não pode mudar os membros da classe, exceto para os membros declarados mutáveis.

Como na MQL dificilmente se pode esperar isto, isto significa que um método não pode mudar um objeto em princípio.

Um método constante não pode mudar apenas o objeto que o chamou. Mas se outro objeto for passado para método sem modificador constante, ele (método) pode mudá-lo com bastante sucesso.
 
Alexey Kozitsyn:
Um método constante não pode mudar apenas o objeto que o chamou.
Isto é um descuido?
 
Alexey Volchanskiy:
Isso é uma gralha?
Explique o que você quer dizer com isso.
 
Ométodo constante é outro exemplo do provérbio "queríamos fazer melhor, mas acabou sendo o mesmo que sempre fazemos". Acho que este é um lema para C++ em tudo. Não há uso prático, mas complica significativamente o projeto dos programas OOP, pois é necessário controlar constantemente o tipo de objeto modificado (deve ser constante também).