Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП 1-3 лекции.docx
Скачиваний:
5
Добавлен:
18.11.2019
Размер:
55.63 Кб
Скачать
    1. Друзья класса

Назначение методов - интерфейс между внешним миром и закрытой (защищенной) частями класса. Еще один способ получить доступ к закрытой части класса - использование внешних функций, объявленых как друг класса. Функции-друзья, как и члены, являются интерфейсом класса и имеют доступ к закрытой (защищенной) части класса.

Функция становится другом после ее объявления в классе с использованием спецификатора friend, например:

class X{ Реализация:

... void f() // глобальная функция

friend void f(); {

public: ...

void fx(); }

...

}

class Y{ void X::fx() // функция-член другого класса

... {

friend void X::fx(); ...

... }

};

class Z{

...

friend class Y; // все функции-члены класса Y являются друзьями класса Z.

...

};

Другом класса могут быть: глобальная функция (см. примеры, приведенные выше); функция-член другого класса; все функции-члены другого класса, т.е. сам класс (при этом функции-друзья одного класса не становятся автоматически друзьями другого класса). Почти любой метод может быть сделан другом. Исключения: конструкторы, деструктор.

Расположение объявления friend в определении класса (в открытой, закрытой или защищенной частях класса) роли не играет - функция-друг класса является внешней по отношению к этому классу. По этой же причине функция-друг класса, не являясь методом класса, не имеет адресата и, следовательно, не имеет указателя this (все аргументы в функцию передаются через список параметров).

Различия между членами и друзьями класса:

Функция-член

Функция-друг

class Rational{

public:

void print();

...

};

void Rational::print()

{

cout << num;

if(den != 1)

cout << '/' << den;

}

...

Rational x(1,5);

x.print();

class Rational{

public:

friend void print(Rational r);

...

};

void print(Rational r)

{

cout << r.num;

if(r.den != 1)

cout << '/' << r.den;

}

...

Rational x(1,5);

print(x);

Вызов функции-друга не является передачей сообщения; поэтому функция-друг не имеет адресата и должна обязательно иметь параметр.

Перегруженные операции - друзья класса:

Бинарная операция

Унарная операция (префиксная и постфиксная)

Объявление

friend тип operator binaryOp (op1, op2)

friend тип operator unaryOp(op1)

friend тип operator unaryOp(op1, int)

Реализация

тип operator binaryOp (тип op1, тип op2)

{ ... }

тип operator unaryOp(тип op1)

{ ... }

тип operator unaryOp(тип op1, int)

{ ... }

Использование

op1 binaryOp op2

эквивалентно: operator binaryOp(op1, op2)

unaryOp op1

эквивалентно: operator unaryOp(op1)

op1 unaryOp

эквивалентно: operator unaryOp(op1, int)

Пример перегрузки операции записи в поток для класса Rational:

class Rational {

friend ostream& operator <<(ostream&, Rational);

...

};

ostream& operator <<(ostream& os, Rational r)

{

os << r.num;

if(r.den == 1)

os << ‘/’ << r.den;

return os;

}