Одно из преимуществ C++, это наличие встроенных в язык конструкций для создания ограничений (constraints). Тут вам и области видимости (public, protected, private), и конечно же ключевое слово const. Но штука в том, что почему-то почти на каждое ограничение есть способ его отменить. Я не говорю про вариант закастить что угодно в (void*) и погнали - тут уж никакой private не спасет, а о тех средствах что встроены в язык - на private есть ключевое слово friend, а на слово const есть const_cast и ключевое слово mutable. Про последнее и речь.
Например, сделаем класс:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() { return x + y; } };Если внимательно посмотреть на класс,то просится само собой поставить ограничение const на метод summ - поскольку он ничего не меняет в состоянии класса. Сделано:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() const { return x + y; } }; Теперь мы не можем написать что-то типо такого:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() const { с++; return x + y; } }; Компилятор нас остановит от такой роковой ошибки - и напишет все то что о нас думает....Мы теперь можем возмутиться и проучить компилятор с помощью слова mutable:
class A { int x; int y; mutable int c; void increment() { x++; y++; c++; } int summ() const { с++; return x + y; }}; Ура! Мы победили!
Если серьёзно, то слово mutable позволяет менять поля, помеченные им, даже в константных методах. Надеюсь всем понятно, что разработчики C++ отнюдь не идиоты и добавили целое ключевое слово не для того, чтобы мы смогли победить назойливый компилятор (как-нибудь напишу про это подробнее). В чем же дело?А дело в формулировке: const у метода класса не позволяет методу менять состояние класса! То есть слово mutable помечает поля, которые не относятся к состоянию класса. Это как? Класс же описывает объекты, а объект = состояние, поведение и идентичность. Где тут что-то еще? Все очень просто: например вам нужен отладочный счётчик, чтобы посмотреть как часто вызывается метод в объектах; или вам надо закэшировать предварительно посчитанные значения или данные, итд. То есть, чаще всего речь о служебных функциях, или об оптимизации. Это очень классно, ведь в сложных и больших проектах такая тема встречается очень часто - и разработчики C++ об этом знают, поэтому добавили такое ключевое слово, чтобы вам не пришлось переписывать пол системы и снимать важные ограничения (убирать const - так не надо делать), из-за отладочного счётчика, который вам вдруг понадобился.
Очевидно, такая гибкость и свобода дает программисту не только мощь, но и ответственность - код надо писать внимательно и соблюдать баланс, и не делать так, как я в шуточном примере)
Всем интересных инженерных задач и красивых реализаций!