Опубликован: 26.06.2003 | Уровень: для всех | Доступ: платный
Лекция 11:

Контроль доступа к объекту

< Лекция 10 || Лекция 11: 123 || Лекция 12 >

Использование описателя const

Во многих примерах мы уже использовали ключевое слово const для обозначения того, что та или иная величина не изменяется. В данном параграфе приводятся подробные правила употребления описателя const.

Если в начале описания переменной стоит описатель const, то описываемый объект во время выполнения программы не изменяется:

const double pi = 3.1415;
const Complex one(1,1);

Если const стоит перед определением указателя или ссылки, то это означает, что не изменяется объект, на который данный указатель или ссылка указывает:

// указатель на неизменяемую строку
const char* ptr = &string;  
char x = *ptr;
ptr++;
*ptr = '0';    
  // обращение по указателю — допустимо
  // изменение указателя — допустимо
  // попытка изменения объекта, на
  // который указатель указывает –
  // ошибка

Если нужно объявить указатель, значение которого не изменяется, то такое объявление выглядит следующим образом:

char* const ptr = &string;   
// неизменяемый указатель  
char x = *ptr;
ptr++;
*ptr = '0';    
  // обращение по указателю – допустимо
  // изменение указателя – ошибка
  // изменение объекта, на который
  // указатель указывает – допустимо

Доступ к объекту по чтению и записи

Кроме контроля доступа к атрибутам класса с помощью разделения класса на внутреннюю, защищенную и внешнюю части, нужно следить за тем, с помощью каких методов можно изменить текущее значение объекта, а с помощью каких – нельзя.

При описании метода класса как const выполнение метода не может изменять значение объекта, который этот метод выполняет.

class A 
{
public:
     int GetValue (void) const;
     int AddValue (int x) const;
private:
     int value;
}
int 
A::GetValue(void) const
{  
     return value; }	  
     // объект не изменяется 
int
A::AddValue(int x) const
{   
     value += x;		
    // попытка изменить атрибут объекта
    // приводит к ошибке компиляции  

     return value;
}

Таким образом, использование описателя const позволяет программисту контролировать возможность изменения информации в программе, тем самым предупреждая ошибки.

В описании класса String один из методов – GetLength – представлен как неизменяемый (в конце описания метода стоит слово const ). Это означает, что вызов данного метода не изменяет текущее значение объекта. Остальные методы изменяют его значение. Контроль использования тех или иных методов ведется на стадии компиляции. Например, если аргументом какой-либо функции объявлена ссылка на неизменяемый объект, то, соответственно, эта функция может вызывать только методы, объявленные как const:

int
Lexer::CharCounter(const String& s, char c)
{      int n = s.GetLength();   // допустимо
     s.Concat("ab");   
      // ошибка – Concat изменяет значение s 
}

Общим правилом является объявление всех методов как неизменяемых, за исключением тех, которые действительно изменяют значение объекта. Иными словами, объявляйте как можно больше методов как const. Такое правило соответствует правилу объявления аргументов как const. Объявление константных аргументов запрещает изменение объектов во время выполнения функции и тем самым предотвращает случайные ошибки.

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Андрей Одегов
Андрей Одегов
Язык программирования C++
Елена Шумова
Елена Шумова

Здравствуйте! Я у Вас прошла курс Язык программировая Си++.

Заказала сертификат. Хочу изменить способ оплаты. Как это сделать?

Иван Иванов
Иван Иванов
Россия, Екатеринбург
Владимир Алемасов
Владимир Алемасов
Россия