вопрос по ОПП

 

Доброго дня!

virtual int       Compare(const CObject *node,const int mode=0) const { return(0);      }

для чего служит служебное слово const после сигнатуры метода?

 

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

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

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

тестовый класс создайте - один метод и одно поле и попробуйте изменить поле в классе вызвав этот метод добавив/убрав модификатор const
 
Igor Makanu:

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

тестовый класс создайте - один метод и одно поле и попробуйте изменить поле в классе вызвав этот метод добавив/убрав модификатор const

Понятно, спасибо! )

А что за неявные члены класса? Кроме, this можно привести пару примеров?

 
Nikolai Karetnikov:

Понятно, спасибо! )

А что за неявные члены класса? Кроме, this можно привести пару примеров?

Насколько я понимаю, это члены класса, объявленные у предков.

Я использую модификатор функции const, для того, чтобы обозначить, что эта функция не меняет состояние объекта, у которого ее вызывают. То есть, при вызове функции с таким модификатором - я могу быть полностью уверен, что после вывода внутри данного объекта никаких изменений не произойдет.

Грубо говоря, если у нас есть объект-сумматор, в который мы будем с помощью функции добавлять значения, то после вызова у него функции с модификатором const - можно быть уверенным, что сумма останется прежней. А вот если такого модификатора у функции нет, но значение суммы во время работы функции может быть и изменено.  Функции типа GetXXX() - я всегда стараюсь делать константными. Ну а функции типа SetXXX() - константными сделать невозможно (по их смыслу). Соответственно, и при вызове - внутреннее состояние после SetXXX() меняется, а после GetXXX() - нет.

Очень полезный модификатор. Позволяет избегать ошибок использования функций.

 
Georgiy Merts:

Насколько я понимаю, это члены класса, объявленные у предков.

Я использую модификатор функции const, для того, чтобы обозначить, что эта функция не меняет состояние объекта, у которого ее вызывают. То есть, при вызове функции с таким модификатором - я могу быть полностью уверен, что после вывода внутри данного объекта никаких изменений не произойдет.

Грубо говоря, если у нас есть объект-сумматор, в который мы будем с помощью функции добавлять значения, то после вызова у него функции с модификатором const - можно быть уверенным, что сумма останется прежней. А вот если такого модификатора у функции нет, но значение суммы во время работы функции может быть и изменено.  Функции типа GetXXX() - я всегда стараюсь делать константными. Ну а функции типа SetXXX() - константными сделать невозможно (по их смыслу). Соответственно, и при вызове - внутреннее состояние после SetXXX() меняется, а после GetXXX() - нет.

Очень полезный модификатор. Позволяет избегать ошибок использования функций

Супер! Спасибо!

 

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

Впрочем, можно поэкспериментировать, работает ли переменно с const быстрее обычной. Если нет, то и смысла в ней нет, если для себя пишешь. 

Интересно, что думает по этому поводу товарищ Саахов?

 
Dmitry Fedoseev:

Поэтому остается гипотеза, что они нужны для группой разработки, чтобы тот, кто не должен, не изменили то, что ему не положено. А если сам для себя пишешь...

...то через год, когда забудешь, как реализована твоя же библиотека, этот модификатор может уберечь от ошибки.

Причина обращения: