Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования С++ и его «подводные камни».DOC
Скачиваний:
39
Добавлен:
01.05.2014
Размер:
1.02 Mб
Скачать

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, сказываются только при наследовании, которое мы рассмотрим несколько позже.

Рекомендуется всегда явно определять права доступа к компонентам класса.