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

 
Alexey Kozitsyn:
Вызов тут при том, что если объект1 класса А вызывает константный метод класса А, то этот метод не может менять этот объект1 (т.е. тот объект1, который его вызвал). Если же объект1 передать по ссылке в этот же самый константный метод, но вызванный из объекта2 класса А, то объект1 можно будет изменить. Объект2, в свою очередь, нет.

Как может объект вызывать метод? Метод может вызываться из функции или из другого метода.

Вызывается не просто метод класса, а метод конкретного объекта. Сам по себе класс это абстракция.

 
Dmitry Fedoseev:

Как может объект вызывать метод? Метод может вызываться из функции или из другого метода.

Вызывается не просто метод класса, а метод конкретного объекта. Сам по себе класс это абстракция.

Вот это жесть. А запись типа

obj.method();

это как называется?

Вы же сами пишите:

Вызывается не просто метод класса, а метод конкретного объекта. 

Вы еще скажите, что допустима такая запись:

method();

Дак метод то что вызывает? 

upd: т.е. посредством чего вызывается метод? 

 
@Alexey Kozitsyn:

Вот это жесть. А запись типа

это как называется?

Вы же сами пишите:

Вы еще скажите, что допустима такая запись:

Дак метод то что вызывает? 

upd: т.е. посредством чего вызывается метод? 

Посмотрите на ситуацию. Непонятки у вас, а не у меня. Пример Алексея вам кажется не корректным, а мне кажется достаточно четким и понятным, вопросов он у меня не вызывал, а только дал понимание.

--

"А запись типа" - называется вызовом метода "method" объекта "obj".

--

"Вы еще скажите, что допустима такая запись" - впечатление такое, что это вы про такое пишите.

---

Метод ничего не вызывает. Метод вызывается. 

 
Dmitry Fedoseev:

Посмотрите на ситуацию. Непонятки у вас, а не у меня. Пример Алексея вам кажется не корректным, а мне кажется достаточно четким и понятным, вопросов он у меня не вызывал, а только дал понимание.

--

"А запись типа" - называется вызовом метода "method" объекта "obj".

--

"Вы еще скажите, что допустима такая запись" - впечатление такое, что это вы про такое пишите.

---

Метод ничего не вызывает. Метод вызывается. 

Пример Алексея вполне допустим, но он не должен, по моему личному мнению, являться примером для других.

Понимаете, Вы так и не ответили на мой вопрос: что инициирует вызов метода класса (или иначе, что вызывает метод (не что вызывается посредством метода, а что/кто вызывает сам метод))?

Любой метод. Простой же вопрос, Вы же статью писали для начинающих по ООП.  

Метод ничего не вызывает. Метод вызывается.  

Дак чем он вызывается?
 
Alexey Kozitsyn:

1. Пример Алексея вполне допустим, но он не должен, по моему личному мнению, являться примером для других.

2. Понимаете, Вы так и не ответили на мой вопрос: что инициализирует вызов метода класса (или иначе, что вызывает метод (не что вызывается посредством метода, а что/кто вызывает сам метод))?

3. Любой метод. Простой же вопрос, Вы же статью писали для начинающих по ООП.  

1. Предложите свой пример.

2. Не ответил. Потому-что вообще непонятно о чем разговор.

3. Тоже уже непонятно о чем разговор. 

 
void fun(){
   obj.method();
}
Метод "method" объекта "obj" вызывается из функции "fun".
 
Dmitry Fedoseev:

1. Предложите свой пример.

2. Не ответил. Потому-что вообще непонятно о чем разговор.

3. Тоже уже непонятно о чем разговор. 

2. Разговор уже о том, что вызывает метод класса (не статический метод). Метод класса вызывается объектом класса или иначе, объект класса инициирует вызов метода класса, например так:

obj.method();   // obj - объект класса А, method() - метод класса А

Если метод константный, то он не может модифицировать объект, посредством которого он был вызван, т.е. объект obj. Переданный же в него объект (например, obj2):

obj.method( obj2 );

может быть модифицирован, если передан по ссылке без модификатора const. Вот и все.

Мне изначально были не понятны заявления "корефеев" форума:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Комбинатор, 2016.01.31 20:32

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

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

или

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vasiliy Sokolov, 2016.02.01 11:55

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

или

Дак почему не может то?! Все прекрасно изменяется. И тут сама формулировка не корректная: константный метод не может менять члены экземпляра своего класса.

 

 
Vasiliy Sokolov:

Я и не отрицаю. Шарп действительно совершенный, великий и прекрасный язык.

Хорошо, допустим с const всегда можно вывернутся. Но лучше кратко объясни на примере, что дает const? В чем его реальная польза? На примере, и желательно не из пальца высосанном.

Одно дело, когда пишешь для себя и весь проект тысячи - десятки тысяч строк. Другое дело, когда проект в миллионы строк и это передается заказчику, а там сидит индус Харикришна, который ни в зуб ногой. Я с индусами из Бангалора работал, уровень реально был ниже, чем у наших ребят.

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

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

 
Alexey Kozitsyn:

...

Дак почему не может то?! Все прекрасно изменяется. И тут сама формулировка не корректная: константный метод не может менять члены экземпляра своего класса.

 

Это и имеется ввиду, потому-что в данном контексте о типе не ведется разговор. "Свой класс" - это очевидно, что свой экземпляр (т.е. объект).

 void bar(X& obj) const 
    {
        obj._x = 42; // Здесь меняем члена не своего класса OK! obj передается по ссылке и не имеет модификатора const
        _x = 42; // Попытка изменить члена своего класса ERROR!
    }

 Член _x принадлежит тому же классу в котором находится метод bar.

C obj._x - здесь член _x находится в постороннем классе obj.

Мне кажется допустимым говорить про класс, а не экземпляр, потому-что очевидно, что _x относится к нашему классу который пишем, и obj.x к постороннему, который обрабатываем. 

Если уж говорить о терминологии ООП, тут вся терминология немного того (или даже много). 

 

Лично я всегда понимал const-методы, как методы, которые не могут менять переменные класса.

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

Static-методы использую широко и густо. Практически в любом сколь-нибудь сложном классе. Обычно это "обслуживающие" дополнительные методы, для работы которых не нужно обращение к переменным класса.

Кроме того, для констант типа "количество секунд в сутках" стараюсь использовать конструкцию static const, а не #define. При этом объявление и инициализация такой константы находится в разных местах, но зато, происходит контроль типов, который также меня не раз выручал.

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