- •1. Дополнения к с
- •1.1. Комментарии
- •1.2. Ключевые слова
- •1.3. Константы
- •1.4. Блочные объявления
- •1.5. Ссылки
- •1.6. Новая роль имён перечислений, структур и объединений
- •1.7. Распределение памяти
- •1.8. Встраиваемые функции
- •1.9. Перегрузка функций
- •1.10. Задание для параметров функции значений по умолчанию
- •1.11. Дополнительные операции для доступа к данным
- •1.12. Предопределённые потоки ввода-вывода
- •2.1. Инкапсуляция
- •2.2. Разграничение доступа (скрытие данных и методов)
- •2.3. Друзья классов
- •2.4. Конструкторы и деструкторы
- •2.5. Конструктор по умолчанию
- •2.6. Конструктор копирования
- •2.7. Несколько слов о деструкторах
- •2.8. Перегрузка операций
- •3.1. Наследование
- •3.2. Виртуальные функции –полиморфизм
- •3.3. Шаблоны
2.2. Разграничение доступа (скрытие данных и методов)
Определив структуру, объединение или класс, можно создавать объекты этого класса (структуры, объединения) и манипулировать ими, используя методы. При этом некоторые данные и методы, инкапсулированные в одном классе, можно сделать недоступными вне реализации класса, а другие могут быть доступны из любого места программы.
Элементы структур, объединений и классов получают атрибуты доступа либо по умолчанию, либо при использовании какого-либо из трех спецификаторов доступа: public, protected или private, которые имеют следующий смысл:
– public.. Компонент доступен для любой функции.
– protected. Компонент может быть использован методами или «друзьями» класса, в котором он объявлен, а также производных от него, но только вобъектах производного класса.
– private.. Компонент может быть использован только методами или «друзьями» класса, в котором он объявлен.
Определены следующие значения доступа по умолчанию для компонентов классов, структур и объединений:
– Класс, определенный с помощью ключевого слова struct – это класс, в котором все элементы по умолчанию являются общедоступными (public), и имеется возможность изменять этот уровень доступа.
– Класс, определенный с помощью ключевого слова union – это класс, в котором все элементы по умолчанию являются общедоступными (public), и этот уровень доступа не может быть изменён,
– Класс, определённый с помощью ключевого слова class – это класс, в котором все элементы по умолчанию являются частными (private), иимеется возможность изменять уровень доступа.
Спецификатор доступа по умолчанию, или заданный явно, действителен для всех последующих объявлений компонентов, пока не встретится какой-либо другой спецификатор доступа.
class MyClass{
. . . // Объявления переменных и методов – по умолчанию private
protected: // Изменяем атрибуты доступа
float fVar; public: // Ещё раз изменяем атрибуты доступа
float * func ( ); {return fVar; }
};
Спецификаторы доступа могут быть перечислены и сгруппированы в любой удобной для программиста последовательности.
Теперь вам стало понятно, почему в примере 2.1 компилятор выдаст сообщение об ошибке – доступ к частным компонентам класса (что установлено по умолчанию) запрещен. Доступ к элементу данных uData может быть организован, например, так:
class Sample {
// элемент данных
unsigned uData;
public: // изменяем права доступа
// методы (компонентные функции)
unsigned write Data (unsigned uArg);
unsigned readData();
. . .
} clInst1, * pcInst2;
Тогда
clInst1.uData = 7; // По-прежнему ошибка !
unsigned uPar = 1;
pcInst2->writeData(uPar); // Теперь правильно
Опять обратим внимание. Методы и данные, определенные после ключевого слова public, представляют собой интерфейс класса, они – единственные – доступны вне класса. Компоненты, определенные после остальных спецификаторов доступа, относятся к внутренней реализации и вне класса недоступны. Различия между компонентами класса, описанными после ключевых слов protected и private, сказываются только при наследовании, которое мы рассмотрим несколько позже.
Рекомендуется всегда явно определять права доступа к компонентам класса.