ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 является логически константой. Это означа- ет, что в теории он не может быть модифицирован, но на практике в некоторых случаях модифицируется.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
