Главная->Інформатика та програмування->Содержание->Изменение данных объекта, объявленных как const, используя ключевое слово mutable

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 8) онлайн

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

Обычно при создании объекта-константы (как описано в главе 6) вам нужна га- рантия того, что данные объекта невозможно будет изменить. Однако иногда случаются ситуации, когда вы хотите создать объект-константу, имеющий опре- деленное поле, которое нужно будет изменять, несмотря на то, что сам объект яв- ляется константой.

В качестве примера давайте представим окно (которое открывается на экра- не для программы). Некоторые возможности окна, такие, как полосы прокрутки

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

Предположим, мы хотим иметь возможность создать константные полосы прокрутки, все атрибуты которых остаются неизменными, за исключением их владельца. Тогда нам и пригодится ключевое слово mutable. В программе MUTABLE показано, как это выглядит.

// mutable.cpp

#include <iostream>

#include <string>

using namespace std;

///////////////////////////////////////////////////////////

class scrollbar

{

  private:

    int size;

    mutable string owner;

  public:

    scrollbar ( int sz, string own ) : size ( sz ), owner ( own )

      { }

    void setSize ( int sz )

      { size = sz; }

    void setOwner ( string own ) const

      { owner = own; }

    int getSize ( ) const

      { return size; }

    string getOwner ( ) const

      { return owner; }

};

///////////////////////////////////////////////////////////

int main ( )

{

  const scrollbar sbar ( 60, "Приложение 1" );

 

  // sbar.setSize ( 100 );

  sbar.setOwner ( "Приложение 2" );

 

  cout << sbar.getSize ( ) << ", " << sbar.getOwner ( ) << endl;

 

  return 0;

}

Атрибут size из данных объекта класса scrollbar не может быть изменен в объ- екте-константе. Однако атрибут owner может быть изменен даже если объект — константа. Для того чтобы позволить это, используем ключевое слово mutable. В функции main() мы создаем объект-константу sbar. Его размер не может быть модифицирован, разве что владельцем с использованием метода setOwner(). (Если объект не константа, то, конечно, можно модифицировать оба атрибута.)

В этой ситуации считается, что sbar является логически константой. Это означа- ет, что в теории он не может быть модифицирован, но на практике в некоторых случаях модифицируется.

 

33