В този урок ще се научим да създаваме функции за приятелство и класове за приятели в C ++ с помощта на примери.
Скриването на данни е основна концепция на обектно-ориентираното програмиране. Ограничава достъпа на частни членове извън клас.
По същия начин защитените членове могат да бъдат достъпни само от производни класове и са недостъпни отвън. Например,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
В C ++ обаче има функция, наречена приятелски функции, която нарушава това правило и ни позволява да получим достъп до функции на членове извън класа.
По същия начин има и приятелски клас , който ще научим по-късно в този урок.
приятел Функция в C ++
А приятел функция могат да имат достъп до частни и защитени данни на класа. Декларираме функция за приятел, използвайки friend
ключовата дума в тялото на класа.
class className (… friend returnType functionName(arguments);… )
Пример 1: Работа на приятел Функция
// C++ program to demonstrate the working of friend function #include using namespace std; class Distance ( private: int meter; // friend function friend int addFive(Distance); public: Distance() : meter(0) () ); // friend function definition int addFive(Distance d) ( //accessing private members from the friend function d.meter += 5; return d.meter; ) int main() ( Distance D; cout << "Distance: " << addFive(D); return 0; )
Изход
Разстояние: 5
Тук addFive()
има функция за приятелство, която има достъп както до частни, така и до публични членове на данни.
Въпреки че този пример ни дава представа за концепцията за функция приятел, той не показва никаква смислена употреба.
По-смислено използване би било оперирането на обекти от два различни класа. Тогава функцията за приятелство може да бъде много полезна.
Пример 2: Добавете членове на два различни класа
// Add members of two different classes using friend functions #include using namespace std; // forward declaration class ClassB; class ClassA ( public: // constructor to initialize numA to 12 ClassA() : numA(12) () private: int numA; // friend function declaration friend int add(ClassA, ClassB); ); class ClassB ( public: // constructor to initialize numB to 1 ClassB() : numB(1) () private: int numB; // friend function declaration friend int add(ClassA, ClassB); ); // access members of both classes int add(ClassA objectA, ClassB objectB) ( return (objectA.numA + objectB.numB); ) int main() ( ClassA objectA; ClassB objectB; cout << "Sum: " << add(objectA, objectB); return 0; )
Изход
Сума: 13
В тази програма ClassA
и ClassB
сте декларирали add()
като функция за приятел. По този начин тази функция може да има достъп до лични данни и от двата класа.
Едно нещо, което трябва да забележите тук, е, че функцията за приятелство вътре ClassA
използва ClassB
. Към ClassB
този момент обаче не сме определили .
// inside classA friend int add(ClassA, ClassB);
За да работи това, имаме нужда от декларация за напред ClassB
в нашата програма.
// forward declaration class ClassB;
приятел Клас в C ++
Можем да използваме и клас на приятел в C ++, използвайки friend
ключовата дума. Например,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Когато даден клас е обявен за приятелски клас, всички членски функции на приятелския клас стават приятелски функции.
Тъй като classB
е приятелски клас, можем да имаме достъп до всички членове на classA
отвътре classB
.
Ние обаче нямаме достъп до членове на ClassB
отвътре classA
. Това е така, защото връзката с приятели в C ++ се предоставя само, но не се взема.
Пример 3: C ++ приятелски клас
// C++ program to demonstrate the working of friend class #include using namespace std; // forward declaration class ClassB; class ClassA ( private: int numA; // friend class declaration friend class ClassB; public: // constructor to initialize numA to 12 ClassA() : numA(12) () ); class ClassB ( private: int numB; public: // constructor to initialize numB to 1 ClassB() : numB(1) () // member function to add numA // from ClassA and numB from ClassB int add() ( ClassA objectA; return objectA.numA + numB; ) ); int main() ( ClassB objectB; cout << "Sum: " << objectB.add(); return 0; )
Изход
Сума: 13
Ето, това ClassB
е приятелски клас на ClassA
. И така, ClassB
има достъп до членовете на classA
.
В ClassB
, ние създадохме функция, add()
която връща сумата от numA и numB.
Тъй като ClassB
е клас на приятели, можем да създаваме обекти ClassA
отвътре на ClassB
.