C++ Friend Function & Class

C++ Friend Functions

जैसा की आपको पता है किसी भी class के public members को class के बाहर आसानी से access किया जा सकता है। लेकिन private और protected members के साथ ऐसा करना possible नहीं है। किसी class का एक friend function उसके private और protected members को भी class के बाहर access कर सकता है।

एक friend function class का member function नहीं होता है। Friend function एक normal function (class के बाहर) होता है जिसे किसी class का friend बनाया जाता है। किसी भी function को friend function बनाने के लिए उसका prototype उस class के अंदर declare किया जाता है, जिस class का friend आप function को बनाना चाहते है। Function के prototype को friend keyword के साथ declare किया जाता है। इस keyword से compiler को पता चल जाता है की declare किया हुआ function class का friend है।

Advantages of Friend Functions

Friend functions को use करने की कुछ advantages निचे दी जा रही है।

  1. Friend functions आपको additional functionality provide करते है जिसे class के बाहर use किया जा सकता है।
  2. यदि class किसी data को खुद use नहीं कर रही है और साथ ही उसे protect भी करना चाहती है तो वो friend function को इस data को use करने के लिए allow कर सकती है।
  3. आप class के private members का access किसी ऐसे function को allow करते है जो की class के बाहर है। इससे आप class के member functions और दूसरे functions को separate कर पाते है।

Friend function का general syntax निचे दिया जा रहा है।

class MyClass
{
    ......
    .....
    friend return-type MyFriendFunc(argument-list); //friend function prototype
    .....
    ....
}

return-type MyFriendFunc(argument-list)
{
   //friend function body
}

int main()
{
     //main() function body
}

ऊपर दिए गए syntax में MyClass के अंदर एक friend function declare किया गया है। Friend function को class के आखिर में declare किया जाना अच्छा रहता है।

आइये अब इसे एक उदाहरण के माध्यम से समझने का प्रयास करते है।

#include<iostream>
using namespace std;

class Addition
{
    private:
                 int a=5,b=2;
    public:
                friend int add(Addition obj);
};

int add(Addition obj)
{
     return obj.a + obj.b;  
}

int main()
{
     Addition obj;
     int result = add(obj);
     cout<<"Result is:"<<result;

     return 0;
}

ऊपर दिए गए उदाहरण में add function को Addition class का friend declare किया गया है। इस function में argument के रूप में Addition class का object pass किया जायेगा ताकि ये Addition class के members पर work कर सके। Class की definition के बाहर friend function आसानी से Addition class के दोनों private members a और b को access कर पाता है। ये program निचे दिया गया output generate करता है।

Result is : 7

जब भी आप friend function declare करते है तो उसमें argument के रूप में उस class का obj pass किया जाता है जिस class का friend ये function है। उदाहरण के लिए यदि कोई class है X और उसका कोई friend function है जिसका नाम MyFriendFunction() है। इस function में argument के रूप में आप X class का object pass करेंगे। ऐसा class members को access करने के लिए किया जाता है। Pass किये गए object से आप function के अंदर class members को access करते है।

C++ Friend Class

एक friend class भी friend function की तरह ही होती है। जब कोई class किसी दूसरी class को अपनी friend class बनाती है तो इस class के सभी members को वह friend class access कर सकती है।

उदाहरण के लिए आपने 2 classes A और B create की हुई है। अब आप चाहते है की B के सभी members A class के सभी private और protected members को access कर सके तो इसके लिए आप A class के अंदर B class को एक friend class के रूप में define करेंगे। इसका structure निचे दिया जा रहा है।

#include <iostream>
using namespace std;

class Addition
{
    private:
                  int a=5;
                  int b=2;
    public:
                  friend class Sum;

                  void display()
                  {
                       cout<<"Value of a is : "<<a<<endl;
                       cout<<"Value of b is : "<<b<<endl;
                  }
};

class Sum
{
        public:
                     int add(Addition obj)
                     {
                          return obj.a+obj.b;
                     }
};

int main()
{
       int result;
       Addition aobj;
       Sum sobj;

       aobj.display();
       result = sobj.add(aobj);
       cout<<"Sum of a and b is : "<<result;
       return 0;
}

Friend class का जो भी function actual class के members को access करना चाहेगा वह argument के रूप में actual class का object pass करेगा। ऊपर दिए गए उदाहरण में Sum class Addition class की friend class है। Sum class के add function में argument के रूप में Addition class का object pass किया गया है और उस object के द्वारा Addition class के private members a और b को access किया गया है। ये program निचे दिया गया output generate करता है।

Value of a is : 5
Value of b is : 2
Sum of a and b is : 7