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

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

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

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

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

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

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

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

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

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

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

Если эта статья оказалась полезной, вы смогли понять различия и что что делает, то это здорово.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

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

Ваш e-mail не будет опубликован.

1 + 1 =

Поиск

 
     

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

https://www.litres.ru/s-m-okulov/diskretnaya-matematika-teoriya-i-praktika-resheniya-zadach-po-informatike-uchebnoe-posobie/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор наполовину пуст, наполовину полон

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок