* Приятелски функции
Публикувано на 06 ноември 2008 в раздел С/С++.
Приятелски се наричат функциите, които не са член-функции на клас, но имат достъп до неговите private елементи. Приятелски функции се използват, когато е необходимо една функция да има достъп до private членовете на два или повече различни класа. Декларацията на приятелската функция може да се намира както в частта public, така и в частта private и се характеризира с ключовата дума friend, която се поставя в началото на декларацията. Една приятелска функция се дефинира като обикновена функция, която не е член на клас. Има два вида приятелски функции:
1. Независима приятелска функция: Тези функции се декларират във всеки от класовете като приятелски. Те не са член-функции на класа и затова те нямат достъп до елементите му. Поради тази причина е необходимо подаването на обект по явен начин като параметър на функцията (съответно извикването ще се извършва чрез името на функцията и списък от фактически параметри).
Пример: Дефинираме два класа представляващи марки автомобили с обща функция за определяне на по-бързият автомобил:
#include "stdafx.h" #include "iostream.h" // Предварителна декларация class bmw; class porsche; class bmw{ private: unsigned maxspeed; public: // Приятелска функция friend int cmpspeed(bmw *, porsche *); bmw(char *, unsigned speed); char *model; }; bmw::bmw(char *c, unsigned speed){ model = c; maxspeed = speed; } class porsche{ private: unsigned maxspeed; public: friend int cmpspeed(bmw *, porsche*); porsche(char *, unsigned speed); char *model; }; porsche::porsche(char *c, unsigned speed){ model = c; maxspeed = speed; } // Дефиниция на приятелската функция int cmpspeed(bmw *a, porsche *b){ // Тя има достъп от елементите maxspeed // въпреки че те са private! return (a->maxspeed - b->maxspeed); } void main(){ bmw *x6 = new bmw("X6 xDrive 35i", 239); porsche *cayenne = new porsche("Cayenne S", 270); if (cmpspeed(x6, cayenne) < 0){ cout << cayenne->model; cout << " is faster!" << endl; } else{ if (cmpspeed(x6, cayenne) > 0){ cout << x6->model; cout << " is faster!" << endl; } else{ cout << x6->model; cout << " and "; cout << cayenne->model; cout << " are at equal speeds"; } } }
2. Член-функция на клас като приятелска за друг клас: При декларирането на приятелската функция трябва да се прецизира класът, на който тя е член-функция с помощта на оператор за принадлежност (::).
Пример: Отново условието от горният пример, но този път функцията cmpspeed е член-функция на класа bmw. Промените в кода са удебелени:
#include "stdafx.h" #include "iostream.h" class porsche; class bmw{ private: unsigned maxspeed; public: bmw(char *, unsigned speed); char *model; // За BMW вече cmpspeed е член-функция int cmpspeed(porsche *); }; class porsche{ private: unsigned maxspeed; public: // Извикваме функцията като приятелска friend int bmw::cmpspeed(porsche*); porsche(char *, unsigned speed); char *model; }; bmw::bmw(char *c, unsigned speed){ model = c; maxspeed = speed; } // Дефиниция на самата функция int bmw::cmpspeed(porsche *b){ return (maxspeed - b->maxspeed); } porsche::porsche(char *c, unsigned speed){ model = c; maxspeed = speed; } void main(){ bmw *x6 = new bmw("X6 xDrive 35i", 239); porsche *cayenne = new porsche("Cayenne S", 270); if (x6->cmpspeed(cayenne) < 0){ cout << cayenne->model; cout << " is faster!" << endl; } else{ if (x6->cmpspeed(cayenne) > 0){ cout << x6->model; cout << " is faster!" << endl; } else{ cout << x6->model; cout << " and "; cout << cayenne->model; cout << " are at equal speeds"; } } }
Задача: Дефинирайте класове успоредник, квадрат и правоъгълник и напишете член-функции за изчисляване на лицата и периметрите на фигурите. Напишете:
- Приятелска за трите класа функция, която отпечатва на екрана фигурата с най-голямо лице и самото лице.
- Член-функция на класа успоредник, която е приятелска за другите два класа и връща числата 0, 1 или 2 в зависимост от това коя от фигурите е с най-голям периметър.
Добави коментар