Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_cpp.doc
Скачиваний:
10
Добавлен:
07.06.2015
Размер:
2.81 Mб
Скачать

"Друзья" классов (friend)

Если в объявлении или определении функции в пределах класса Х используется спецификатор friend, то такая функция становится "другом" класса Х.

"Друг" F класса X - это функция или класс, который, не являясь функцией-элементом Х, имеет право доступа к элементам Х, включая разделы private и protected. Во всех прочих отношениях F() - это обычная с точки зрения области действия, объявления и определения функция.

Поскольку функция F() не является элементом Х, она не лежит в области действия Х и поэтому для Х хobj, *xptr; не может вызываться операциями выбора xobj. F() и xptr->F (где xobj - это объект класса Х, а xptr - это указатель на класс Х).

Дружественная функция, определенная в пределах класса (inline), подчиняется тем же правилам встраивания, что и функции-элементы класса. На дружественные функции не действуют спецификаторы доступа. Например:

Объявление класса

Опpеделения для функций

class X {

int i; // private

friend void friend_func(X*, int); // friend_func не является private,

// хотя она и объявлена в разделе

// private

public:

void member_func(int);

};

void friend_func(X* xptr, int a) { xptr->i = a; } // доступ к private int i открыт

void X::member_func(int a) { i = a; }

// в функцию-член не нужно

// передавать указатель или ссылку на

// класс, т.к. доступ к ней

// осуществляется через объект класса

// операцией выбора (.)

X xobj; // объявление объекта xobj класса Х

Отметим различие в вызовах функций:

friend_func(&xobj, 6); // вызов без имени объекта как обычная функция

xobj.member_func(6); // вызов с именем объекта класса

Можно сделать все функции класса Y дружественными для класса Х в одном объявлении:

class Y; // неполное объявление

class X {

friend Y; // класс Y является

// дружественным для Х

int i;

void member_funcX();

};

class Y; { friend void X::member_funcX();

public:

void fr_X1(X&);

void fr_X2(X*);

...

};

Функции fr_x1() и fr_x2(), объявленные в Y, являются дружественными для Х, хотя они и не имеют спецификаторов friend. Они имеют доступ к частным элементам Х (private), таким как i и member_funcX(). Кроме того, отдельные функции-члены класса Х также могут быть дружественными для класса Y.

"Дружественность" классов не транзитивна: если X является дружественным для Y, а Y - дружественный для Z, это не означает, что X - дружественный Z. Однако, "дружественность" наследуется.

Ход работы

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

  2. В соответствии с индивидуальным заданием, разработать структуру базового класса и наследников (не менее 3-х производных классов на двух уровнях иерархии). Использовать конструкторы и деструкторы для инициализации данных и уничтожения объектов классов. Использовать замещающие функции-члены для работы с объектами классов.

  3. Разработать алгоритм решения задачи и программу.

  4. Набрать программу на компьютере и устранить ошибки.

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]