- •Часть II Объектно-ориентированное проектирование Конспект лекций
- •Процесс разработки пп
- •Пример ооПр (объектно-ориентированного проектирования)
- •Определение объектно-ориентированного языка программирования (оояп)
- •Разработка класса в ооп.
- •Уровни видимости
- •Методы класса
- •Конструкторы и деструктор
- •Объявление методов класса
- •Реализация класса: общие положения
- •Определение конструкторов: примеры
- •Определение методов класса
- •Использование класса
- •Примеры использования класса
- •Перегрузка функций
- •Перегрузка операций
- •Выбор функции
- •Друзья класса
- •Друзья или члены
- •Преобразования типа
Друзья класса
Назначение методов - интерфейс между внешним миром и закрытой (защищенной) частями класса. Еще один способ получить доступ к закрытой части класса - использование внешних функций, объявленых как друг класса. Функции-друзья, как и члены, являются интерфейсом класса и имеют доступ к закрытой (защищенной) части класса.
Функция становится другом после ее объявления в классе с использованием спецификатора 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;
}