Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lect05

.pdf
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
411.08 Кб
Скачать

5. Друзьякласса. Наследование.

«Объектно-ориентированное программирование»

доцентПриваловМ.В.

Донецк,ДонНТУ,2011

Друзьякласса

Класс,функцияилиметод,имеющие доступкзакрытойчастидругого классаназываютсядругомклассаили

дружественнымклассом(функцией, методом).

Друзейобъявляютспомощью модификатораfriend

Друзья...Дазачемонинужны

классу?!

vector multiply(const matrix& m, const vector& v) {

vector r;

for (int i = 0; i<4; i++) { r.elem(i) = 0;

for (int j = 0; j<4; j++) r.elem(i) +=m.elem(i,j)

}

* v.elem(j);

return r;

}

Друзья...Дазачемонинужны классу?!

Реализацияправильная?Правильная.

НОМЕДЛЕННАЯ!

Арифметическихопераций:16сложений,16 умножений,20присваиваний.52операции.

Вызововметодов:4*(1+4*3)=52.

Методсложнееэлементарнойоперации!

Решениепроблемы:

дружественность.

Проблема:"излишняя"защитаатрибутов.

Очевидноерешение:сделатьвнутренние свойстваклассовpublic.

Новедь...Нарушатьинкапсуляциюплохо!

Можносделатьфункциюумноженияобщей дляобоихклассов. Средство- friend

Свойствадрузей

Друзьяимеютдоступковсейобласти видимостикласса

"Другмоегодруганемойдруг"

Друзьяненаследуются

Приобъявлениидрузейчастовозникают циклическиессылкиклассовдругнадруга. Такаяситуацияможетбытьрешенапутем использованияупреждающегоописания.

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

class matrix;

class vector {

float v[4]; // ...

friend vector multiply(const matrix&, const vector&);

};

class matrix { vector v[4]; // ...

friend vector multiply(const matrix&, const vector&);

};

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

vector multiply(const matrix& m, const vector& v) { vector r;

for (int i = 0; i<3; i++) {

r.v[i] = 0;

for ( int j = 0; j<3; j++) r.v[i] +=m.v[i][j] * v.v[j];

}

return r;

}

Другиеразновидностидрузей

class MyClass;

class MyClass2

{

public:

MyClass2(){}

void FriendMethod(MyClass classParam);

};

Другиеразновидностидрузей

class MyClass {

friend class MyFriend;

friend void MyClass2::FriendMethod(MyClass

classParam);

friend void FriendFunction(MyClass classParam);

public: MyClass() {} int x;

private: int y;

};

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