← Назад ко всем вопросам

Где применяется mutable в константном методе

1️⃣ Как кратко ответить

Ключевое слово mutable в C++ позволяет изменять члены объекта, объявленные как mutable, даже в константных методах. Это полезно, когда необходимо изменить внутреннее состояние объекта, не влияя на его логическое состояние, например, для кэширования или ведения статистики.

2️⃣ Подробное объяснение темы

В C++ константные методы (const методы) предназначены для того, чтобы гарантировать, что они не изменяют состояние объекта, для которого они вызываются. Это достигается путем добавления ключевого слова const в конец объявления метода. Однако, иногда возникает необходимость изменить некоторые внутренние данные объекта, которые не влияют на его логическое состояние. В таких случаях используется ключевое слово mutable.

Зачем это нужно

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

  • Кэширование результатов: Если метод выполняет сложные вычисления, результат которых можно сохранить для последующего использования, mutable позволяет сохранить этот результат в кэше.
  • Ведение статистики: Например, подсчет количества вызовов метода или времени выполнения.

Как это работает

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

Пример кода

#include <iostream>
​
class Example {
public:
    Example() : call_count(0) {}
​
    // Константный метод, который не должен изменять состояние объекта
    void constMethod() const {
        // Увеличиваем счетчик вызовов, несмотря на то, что метод константный
        ++call_count;
        std::cout << "constMethod called " << call_count << " times\n";
    }
​
private:
    // Член данных, который может изменяться в константных методах
    mutable int call_count;
};
​
int main() {
    Example example;
    example.constMethod(); // Вывод: constMethod called 1 times
    example.constMethod(); // Вывод: constMethod called 2 times
    return 0;
}

Объяснение кода

  • class Example: Определяет класс Example с одним приватным членом данных call_count.
  • mutable int call_count: Объявляет call_count как mutable, что позволяет изменять его в константных методах.
  • void constMethod() const: Определяет константный метод constMethod, который не должен изменять состояние объекта, но может изменять call_count благодаря mutable.
  • ++call_count: Увеличивает call_count при каждом вызове constMethod, демонстрируя возможность изменения mutable члена в константном методе.
  • main: Создает объект example и вызывает constMethod дважды, показывая, что call_count увеличивается, несмотря на то, что метод константный.

Использование mutable позволяет разработчикам сохранять логическую неизменность объекта, при этом изменяя его физическое состояние для внутренних нужд, таких как кэширование или ведение статистики.

Тема: C++ Язык (квалификаторы, cast, категории значений)
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки