Опубликован: 26.06.2003 | Доступ: свободный | Студентов: 39519 / 6479 | Оценка: 4.07 / 3.80 | Длительность: 15:08:00
ISBN: 978-5-9556-0017-8
Лекция 11:

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

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Аннотация: Рассматриваются возможности контроля доступа к атрибутам и методам объекта, контроль по чтению и по записи.

Интерфейс и состояние объекта

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

Определение класса можно поделить на три части – внешнюю, внутреннюю и защищенную. Внешняя часть предваряется ключевым словом public, после которого ставится двоеточие. Внешняя часть – это определение интерфейса. Методы и атрибуты, определенные во внешней части класса, доступны как объектам данного класса, так и любым функциям и объектам других классов. Определением внешней части мы контролируем способ обращения к объекту. Предположим, мы хотим определить класс для работы со строками текста. Прежде всего, нам надо соединять строки, заменять заглавные буквы на строчные и знать длину строк. Соответственно, эти операции мы поместим во внешнюю часть класса:

class String
{
public:
   // добавить строку в конец текущей строки
   void Concat(const String& str);
   // заменить заглавные буквы на строчные
   void ToLower(void);
   int GetLength(void) const;   
   // сообщить длину строки
     . . .
};

Внутренняя и защищенная части класса доступны только при реализации методов этого класса. Внутренняя часть предваряется ключевым словом private, защищенная – ключевым словом protected.

class String
{
public:
   // добавить строку в конец текущей строки
   void Concat(const String& str);
   // заменить заглавные буквы на строчные
   void ToLower(void);
   int GetLength(void) const;   
   // сообщить длину строки
private:
     char* str;
     int length;
};

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

Объявляя атрибуты str и length как private, мы говорим, что непосредственно к ним обращаться можно только при реализации методов класса, как бы изнутри класса ( private по-английски – частный, личный). Например:

int
String::GetLength(void) const
{
     return length;
}

Внутри определения методов класса можно обращаться не только к внутренним атрибутам текущего объекта, но и к внутренним атрибутам любых других известных данному методу объектов того же класса. Реализация метода Concat будет выглядеть следующим образом:

void
String::Concat(const String& x)
{
     length += x.length;
     char* tmp = new char[length + 1];
     ::strcpy(tmp, str);
     ::strcat(tmp, x.str);
     delete [] str;
     str = tmp;
}

Однако если в программе будет предпринята попытка обратиться к внутреннему атрибуту или методу класса вне определения метода, компилятор выдаст ошибку, например:

main()
{
     String s;
     if (s.length > 0)   // ошибка
          . . . 
}

Разница между защищенными ( protected ) и внутренними атрибутами была описана в предыдущей лекции, где рассматривалось создание иерархий классов.

При записи классов мы помещаем первой внешнюю часть, затем защищенную часть и последней – внутреннюю часть. Дело в том, что внешняя часть определяет интерфейс, использование объектов данного класса. Соответственно, при чтении программы эта часть нужна прежде всего. Защищенная часть необходима при разработке зависимых от данного класса новых классов. И внутреннюю часть требуется изучать реже всего – при разработке самого класса.

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

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

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