Что означает модификатор const после объявления метода

 

Задали вопрос в личке, что это означает. Рушил на форуме ответить, так как нашел полезный примерчик, который вносит ясность.
Кстати, если владеете английским, очень полезно задать такой вопрос на английском в Гугле, причем не по MQL, а по С++. Например так 
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Будет куча ссылок на чисто программерские форумы, а С++ довольно похож на MQL 

Я перевел комменты на русский и немного подправил для совместимости с MQL. Внизу прикрепляю скрипт, скомпилируйте и все станет ясно. 

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;
};
Файлы:
TestConst.mq4  2 kb
 
Alexey Volchanskiy:

Задали вопрос в личке, что это означает. Рушил на форуме ответить, так как нашел полезный примерчик, который вносит ясность.
Кстати, если владеете английским, очень полезно задать такой вопрос на английском в Гугле, причем не по MQL, а по С++. Например так 
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Будет куча ссылок на чисто программерские форумы, а С++ довольно похож на MQL 

Я перевел комменты на русский и немного подправил для совместимости с MQL. Внизу прикрепляю скрипт, скомпилируйте и все станет ясно. 

А документация ясности не вносит?

Метод с модификатором const называется постоянным и не может модифицировать неявные члены своего класса. Объявление постоянных функций класса и постоянных параметров называется контролем постоянства (const-correctness). Благодаря такому контролю можно быть уверенным, что компилятор проследит за неизменностью значений объектов и выдаст ошибку еще на стадии компиляции в случае нарушения.

Модификатор const ставится после списка аргументов внутри объявления класса. Определение вне класса также должно включать модификатор const: 

Дополнительным аргументом в пользу использования контроля целостности служит то, что компилятор в этом случае производит специальную оптимизацию, например, располагает постоянный объект в памяти только для чтения.

Статическая функция не может быть определена с модификатором const, так как данный модификатор гарантирует неизменность членов экземпляра при вызове такой функции. Но, как уже говорилось выше, статическая функция по определению не может обращаться к нестатическим членам класса. 

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

Причем, на мой взгляд, Вы представили не самый удачный пример составления структуры (вначале методы, затем данные-члены). И, если уж на то пошло, лучше все это обернуть не в структуру, а в класс, т.к. структуры обычно используют в качестве объединения данных (без методов).

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

А документация ясности не вносит?

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

Причем, на мой взгляд, Вы представили не самый удачный пример составления структуры (вначале методы, затем данные-члены). И, если уж на то пошло, лучше все это обернуть не в структуру, а в класс, т.к. структуры обычно используют в качестве объединения данных (без методов).

Вносит  

Вот я же помнил, что где-то в доке об этом писали, а не нашел с ходу. Пример по быстрому передрал со стэковерфлоу. Где ставить данные - личное дело программиста, хотя я и сам ставлю в начале. Использовать структуры или класс - личное дело программиста )))

 
Alexey Volchanskiy:

Вносит  

Вот я же помнил, что где-то в доке об этом писали, а не нашел с ходу. Пример по быстрому передрал со стэковерфлоу. Где ставить данные - личное дело программиста, хотя я и сам ставлю в начале. Использовать структуры или класс - личное дело программиста )))

Так можно много про что сказать "личное дело". Только Вы кому-то объясняете, причем не в личке, а публично. И Ваше "личное дело" расходится с хорошим стилем программирования. А тот, кому Вы это объясняете, и многие другие пользователи могут воспринять это за хороший стиль, коим он не является.

И о человеке, который здесь хотел (а может и вел) курсы, такое "тяп ляп по-быстрому" говорит очень многое. 

 
Метод с модификатором const называется постоянным и не может модифицировать неявные члены своего класса. 
Какие члены явные, какие неявные?
 
Dmitry Fedoseev:
Какие члены явные, какие неявные?

Видимо, в данном контексте, это те члены, которые вызывают данный метод. Или, иначе, это члены, к которым можно обратиться через this из метода.

 

В С++ это означает, что метод не может менять членов класса, за исключением членов, объявленных mutable.

Т.к. в MQL такого хрен дождешься,  это означает, что метод в принципе не может изменять объект.

 
Комбинатор:

В С++ это означает, что метод не может менять членов класса, за исключением членов, объявленных mutable.

Т.к. в MQL такого хрен дождешься,  это означает, что метод в принципе не может изменять объект.

Константный метод не может изменять только тот объект, который его вызвал. Но если другой объект передан в метод без модификатора const, он (метод) вполне успешно может его изменить.
 
Alexey Kozitsyn:
Константный метод не может изменять только тот объект, который его вызвал
Это очепятка?
 
Alexey Volchanskiy:
Это очепятка?
Поясните, что Вы имеете ввиду?
 
Константный метод - очередной пример пословицы "хотели как лучше, получилось как всегда". Думаю для С++ это вообще девиз. Практической пользы нет никакой, зато существенно затрудняет проектирование ООП-программ, т.к. постоянно требуется контролировать тип модифицируемого объекта (должен быть также константным). 
Причина обращения: