kachsheev
@kachsheev
C++ one love

Зачем используются константные методы?

Возможно вопрос глупый. Задался, т.к. не совсем понимаю назначение...
Зачем использовать константные методы в классе, если ты сам автоматом можешь гарантировать, что при вызове данных методов у тебя данные в объекте не изменятся?
  • Вопрос задан
  • 7622 просмотра
Решения вопроса 1
GavriKos
@GavriKos
То, что вы можете гарантировать, еще не значит что вы вспомните что это значение менять нельзя. Реальный случай, когда через 100500 функций пришел указатель, который нельзя было чистить (чистился сам после вызова этих 100500 функций), в одной из них небыло const и ради оптимизации было решено грохать в ней этот указатель. Итог - мифические креши при особом положении звезд, 2 ночи дебага и конст везде где значение НЕ ДОЛЖНО меняться. Так исключился человеческий фактор - компилятор просто по ушам даст если попытается кто то удалить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@lookid
Для того же что и константные ссылки в аргументах функции. Для наглядности. Для API это довольно критично, что пользователь видя функцию с ходу понимает, что от неё ожидать. Так же const-метод вызывается у констант. C++ создавался когда программирование было либо промышленным, либо исследовательским. Дома "под пивко" не особо кодили. Поэтому напридумывали, ориентируясь сразу на людей с опытом.
Ответ написан
Комментировать
AxisPod
@AxisPod
У константных объектов можно вызвать только константные методы, поэтому и требуется помечать все методы, которые не изменяют данные.

UPD. Судя по ответам, половина вообще не понимает о чём вопрос. Дабы развеять все непонятки, чутка подробнее.

class foo {
  int val;
  int get_counter;
public:
  foo(int v) : val(v), get_counter(0) {}
  int get() { ++get_counter; return val; }
  int get() const { return val; }
  int get_counter() const { return get_counter; }
};

foo f(123141);
const foo f2(f);

f.get(); // вызывается нормально
f.get_counter(); // вызывается нормально, даже с пометкой const, даже в случае, если нет не const версии

f2.get(); // без const версии метода была бы ошибка компиляции
f2.get_counter(); // вызывается без проблем


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

Ну и если идти дальше, то стандартная библиотека активно использует const объекты. И без адекватного понимания работы модификатора const лезть в C++ вообще не следует.
Ответ написан
Комментировать
@DancingOnWater
К тому, что сказали выше пример из Qt:

T* data ()
const T* data () const

Его можно переделать в таком виде:
T data ()
const T& data () const


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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы