- •Часть 1:
- •Имена, их области существования и видимости.
- •Объявления и определения.
- •Атрибуты компоновки имен.
- •Использование имен на различных стадиях создания программ.(спросить)
- •Объекты, их типы и классы памяти.
- •Имена типов данных. (спросить)
- •Встроенные и составные типы данных. Квалификатор const.
- •Рекурсивный вызов функций. Тип «указатель на функцию» (спросить). 82
- •Перегрузка функций.
- •Шаблоны функций.
- •Часть 2:
- •Процедурное и объектно-ориентированное программирование.
- •Понятие класса.
- •Работа с this.
- •Конструкторы и деструкторы, их вызов.
- •Уровни доступа. Использование дружественных классов.
- •Перегрузка операций.
- •Абстрактные базовые классы.
- •Шаблоны классов.
- •Часть 3:
- •Множественное наследование.
- •Явные преобразования static_cast, dynamic_cast.
- •Обработка исключительных ситуаций.
Создание массивов объектов.
Уровни доступа. Использование дружественных классов.
Ключи доступа
При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа 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 не является спецификатором доступа и не наследуется.