Инкапсуляция. Управление доступом к членам класса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Инкапсуляция. Управление доступом к членам класса



Класс включает как данные, так и функции (код). Доступ к элементам класса управляем. Это управление касается не только данных, но и кода.

Чтобы использовать класс необходимо знать, какие функции и какие данные доступны. Набор используемых функций и доступных данных называется пользовательским интерфейсомкласса.

Главная забота при создании класса - скрыть как можно больше информации. Это накладывает ограничения на использование данных или кода внутри класса. Существует три вида пользователей класса:

- сам класс (функции-члены имеют прямой доступ к членам класса);

- обычные пользователи (доступ из функции main() и функций);

- производные классы (доступ из классов-наследников к членам базовых классов)

Каждый вид пользователей обладает разными привилегиями доступа. Каждый уровень привилегий доступа ассоциируется с определенным ключевым словом. Уровней привилегий доступа в С всего три, они определяются ключевыми словами:

- private – закрытые члены класса;

- protected – защищённые члены класса;

- public открытые члены класса.

public - элемент может использоваться любой функцией и операторами программы;

private - элемент может использоваться только функциями-членами и "друзьями" класса, в котором они объявлены;

protected - то же самое, что для private, но кроме того, элемент может быть использован функциями–членами и функциями-«друзьями» классов, производных от объявленного класса.

Элементы класса по умолчанию имеют атрибут private, поэтому спецификаторы доступа public и protected должны задаваться явно.

Элементы struct по умолчанию имеют атрибут public, но вы можете переопределить доступ при помощи спецификаторов доступа private или protected.

Элементы union по умолчанию имеют атрибут publiс. Переопределить его нельзя. Задавать спецификаторы доступа для элементов объединения недопустимо.

Модификатор доступа (по умолчанию или заданный) остается действительным для всех последующих объявлений элементов, пока не встретится другой модификатор доступа. Например:

class X { int i; // X::iпо умолчаниюprivаte char ch; // X::chаналогично Х::i public: int j; //следующие два // элемента- public int k;// открытые данные-члены protected: int l; // X::l - protected }; struct Y { int i; // Y::iпо умолчаниюpublic private: int j; // Y::j - private public: int k; // Y::k - public }; union Z { int i; // publicпо умолчанию, // другихвариантов нет double d;}; // public

Спецификаторы доступа могут следовать и повторяться в любой удобной последовательности.

Пример:

class AccessControlExample {

int value_1; // приватные члены-класса по умолчанию, доступны только

void f_1 (long); // функциям – членам класса

private:

int value_2; // тоже приватные, доступны только

intf_2 (char *); // функциям–членам класса

public:

char* value_3; // общедоступные члены класса

long f_3 ();

protected:

int value_4; // защищенные члены, доступны только функциям – членам

void f_4 (long); // класса и классов-наследников (производных классов)

};

Приватные (private) члены класса имеют наиболее ограниченный доступ. Только сам класс или классы, объявленные как дружественные (friend) имеют доступ к приватным членам. Производные классы не имеют доступа к приватным членам родительского класса. Концепция сокрытия информации реализована в языке только частично, чтобы предотвратить нечаянныйдоступ к внутренним переменным или функциям класса, поскольку преднамеренныйдоступ можно всегда получить к любой части класса в обход обычных способов.

Для того, чтобы использовать общедоступные члены класса внутри функции, необходимо иметь доступ к данным-членам или функциям-членам или и к тому, и к другому. Чтобы сделать члены общедоступными, их нужно объявить в секции public.

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

Классы памяти для объектов

Класс, в смысле распределения памяти, рассматривается как вид структуры. Как и структуры, классы могут быть объявлены с такими классами памяти, как автоматический (auto), внешний (extern) или статический (static).

Переменные (Идентификаторы), объявленные внутри класса, видимы только в сочетании с объектами класса. При неоднозначном толковании должен использоваться оператор разрешения области видимости (::).

Использование данных-членов класса

Инкапсуляция позволяет скрыть какие-то данные и функции внутри класса. Данных может быть столько, сколько нужно и сколько позволяет память. Однако их может и не быть вообще.

Попытка инициализировать данные внутри объявления класса ошибочна. Класс - это не объект и память для него не будет выделена до тех пор, пока не будет создан экземпляр этого класса. Данные, объявленные в классе, следует рассматривать как поля структуры, а не как переменные. Как и для структуры, нужно объявить объект с типом (именем) класса, а затем инициализировать данные члены.

Данные-члены создаются с тем же классом памяти, что и объект класса. Если объект объявляется автоматическим, то все его данные будут автоматическими. Статические данные-члены являются исключением из этого правила: когда создаётся объект со статическими членами (данными), память под них невыделяется, потому что это приведёт к появлению нескольких копий статических данных. Если в классе данное объявляется статическим (static), то все экземпляры класса будут разделять одно и тот же данное-член. Статический член данных, как и глобальная переменная, размещается в фиксированной области памяти на стадии компоновки. Для объявления или инициализации статических данных используется в точности та же нотация, что и для глобальных переменных (ехtern ).

Если данное-член класса объявлен как статический, то компоновщик выделяет под него память только один раз, когда производится объявление этого данного в классе. Поэтому инициализировать статическую переменную можно в момент её объявления. Статические элементы всегда остаются статическими.

Привилегии доступа к статическим данным отличаются от привилегий доступа к нестатическим. К статическому данному необходимо всегда обращаться через имя класса и оператор разрешения области видимости (:: ), независимо от того, объявлен он как приватный, общедоступный или защищенный.

Оператор разрешения области видимости (::) – используется для доступа к данным- членам:

- через функцию-член класса;

- через класс, объявленный дружественным для данного класса.

Для доступа к открытым членам класса используется оператор точка (.) с объектами или оператор (->) с указателями на объекты класса.

Для доступа к закрытым и защищённым членам класса используются функции-члены открытой части класса.

 

Ход работы

1 Изучить теоретические сведения.

2 В соответствии с индивидуальным заданием разработать структуру класса, сделать определение функций-членов класса (class), разработать алгоритм использования объектов и указателей на объекты класса для доступа к данным и функциям- членам. Проверить возможность доступа к членам класса в разделах private, public, protected. В разделах объявить минимум по одному данному-члену, включая статические (static).

3 Набрать программу на компьютере.

4 Устранить ошибки.

5 Получить результат.

6 Оформить отчет.

7 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.

Индивидуальное задание к лабораторной работе №20.

Составить программу для объявления и использования данных типа класс согласно индивидуальному заданию, приведенному в таблице 20.1.

Таблица 20.1 - индивидуальные задания

Базовый класс Производный класс Производный класс
1 источник света костёр фонарь
2 хранилище зернохранилище элеватор
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 флора лес куст
37 посуда кастрюля тарелки

 

Требования к содержанию отчёта приведены в лабораторной работе №1.

Контрольные вопросы для подготовки и самостоятельной работы

1 Дайте определение понятиям: объект, класс, данные-члены класса, функции-члены класса.

2 В чём отличие между классом и объектом класса?

3 Можно ли определить функцию внутри класса?

4 Можно ли использовать в различных классах одинаковые имена данных и функций-членов?

5 Какие классы памяти можно использовать при объявлении объектов?

6 Можно ли использовать классы памяти при объявлении членов класса, почему?

7 Что означает термин инкапсуляция?

8 Как производится управление доступом к элементам класса?

9 Что означают спецификаторы доступа public, protected, private

10 Назовите спецификатор доступа по умолчанию к членам класса и структуры.

11 Ограничивается ли количество и порядок следования разделов в классе?

12 Назовите особенности использования статических (static ) членов класса.

13 Для чего используется оператор разрешения области видимости (::)?

14 Могут ли структуры содержать функции в качестве элементов?

15 Могут ли структуры и классы быть вложенными?

16 Какова область действия членов класса?

17 Как получить доступ к статическим членам класса из программы?

18 Можно ли объявить тип в теле класса при объявлении класса?

Лабораторная работа №21



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 966; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.0.24 (0.019 с.)