Функции и класове за приятели на C ++ (с примери)

В този урок ще се научим да създаваме функции за приятелство и класове за приятели в 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.

Интересни статии...