Константные методы классов. Константные объекты. Ключевое слово mutable

Иногда программисты описывают методы класса обозначая методам константность. Константы вообще полезно применять. Чтобы понимать, зачем нужны константные методы класса, прежде всего нужно понимать зачем вообще нужны константы:

  • Применение константности к обычной переменной даёт возможность защитить значение переменной от изменений.
  • Применение константности к методу класса даёт возможность защитить состояние некоторых данных класса от влияния метода на них.
Чтобы понять второе, надо посмотреть код:

Есть методы записывающие (их ещё называют сеттерами) и методы читающие (геттеры). Если метод не должен влиять на состояние объекта, то такой метод имеет смысл делать константным.
Пусть мы ошиблись при написании кода, перепутали функцию и попробовали изменить x, принадлежащее классу, внутри функции читающей:

Конечно, сейчас эта ошибка выглядит нелепо и сама ситуация притянута за уши. Но сможете ли всегда знать, чисто читающая ли функция? Сама суть, надеюсь, ясна.
В целом, можно обозначать или саму переменную как константу, тогда изменять её не сможет ни один метод класса, или обозначать константный метод, чтобы разделять могущие изменять переменную класса методы и немогущие.
В некоторых случаях внутри класса требуется переменная, которая ни при каких обстоятельствах не должна становиться константной. Практически полезного примера я привести не могу. О мьютексах и хешах писать не смею. Поэтому приведён будет очень простой пример подсчёта числа вызова некоторой функции класса.
  • Для обозначения переменной класса быть всегда неконстантной используется ключевое слово С++ mutable

В очень-очень старых компиляторах может не быть ключевого слова mutable, оно появилось где-то с 1992-го года. Пример #2 демонстрирует возможность исключить навешивания константности на переменную класса методом класса.
Но вернёмся к константным методам. От них может быть очень значимая польза.

  • У константного объекта могут быть вызваны только константные методы.
Константный объект — это неизменяемый экземпляр класса.

Здесь используется конструктор класса. Вы должны понять, что константные объекты создаются также, как создаются константные переменные. Поскольку константные переменные требуют обязательной инициализации, я задействовал конструктор класса.
Смысл здесь такой, что если объект константный, то никакие его внутренние данные изменению не подлежат. Если данное класса заявлено mutable, то используя методы класса можно влиять на такое данное:

Немного отвлечёмся от константных методов. Когда вы используете константные объекты, должны понимать, что в отличие от обычных переменных, в основном, менять их внутреннее состояние нельзя, но изменения некоторым данным объекту может быть позволено или использованием ключевого слова mutable или использованием ключевого слова static.

В листинге #4.1 было отказано от константости вообще. Чтобы вам было проще проанализировать следующее:

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

Если эта статья оказалась полезной, вы смогли понять различия и что что делает, то это здорово.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/endru-tanenbaum/operacionnye-sistemy-razrabotka-i-realizaciya-15418253/?lfrom=15589587
Яндекс.Метрика