Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы для экзамена по курсу ООП.doc
Скачиваний:
4
Добавлен:
21.04.2019
Размер:
180.22 Кб
Скачать
  1. Создание массивов объектов.

  2. Уровни доступа. Использование дружественных классов.

Ключи доступа

При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулиру­ется с помощью ключей доступа private, protected и public:

class имя : [private | protected | public] баэовый_класс { тело класса };

Если базовых классов несколько, они перечисляются через запятую. Ключ досту­па может стоять перед каждым классом, например:

class А { ... }; class В { ... }: class С { ... };

class D: A, protected В. public С { ... };

По умолчанию для классов используется ключ доступа private, а для структур — public.

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

Ключ доступа

Спецификатор а базовом классе

Доступ в производном классе

private

private

нет

protected

private

public

private

protected

private

нет

protected

protected

public

protected

public

private

нет

protected

protected

public

public

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

Элементы protected при наследовании с ключом private становятся в производ­ном классе private, в остальных случаях права доступа к ним не изменяются.

Доступ к элементам public при наследовании становится соответствующим клю­чу доступа.

Если базовый класс наследуется с ключом private, можно выборочно сделать некоторые его элементы доступными в производном классе, объявив их в сек­ции public производного класса с помощью операции доступа к области види­мости:

class Base{

public: void f(): class Derived : private Base{

public: Base::void f():

}:

Дружественные функции и классы

Иногда желательно иметь непосредственный доступ извне к скрытым полям класса, то есть pacширить интерфейс класса. Для этого служат дружественные функции и дружественные классы.

Дружественная функция

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

Ниже перечислены правила описания и особенности дружественных функций.

  • Дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым словом friend. В качестве параметра ей должен передаваться объект или ссылка на объект класса, поскольку указатель this ей не передается.

  • Дружественная функция может быть обычной функцией или методом друго­го ранее определенного класса. На нее не распространяется действие специ­фикаторов доступа, место размещения ее объявления в классе безразлично.

  • Одна функция может быть дружественной сразу нескольким классами.

Дружественный класс

Если все методы какого-либо класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным с помощью ключевого слова friend. В приведенном ниже примере класс mistress объявляется дружественным классу hero:

class hero{

friend class mistress;

}

class mistress{

void fl(): void f2();

}

Объявление friend не является спецификатором доступа и не наследуется.