🤝
Operator Overloading

Friend Functions

Private Members Tak Controlled Access
💡 friend function ek trusted family friend jaisa hai — normally koi outsider tumhare ghar ke private rooms mein nahi ja sakta, lekin ek trusted friend ko special permission mil sakti hai.

friend keyword kisi function (ya class) ko kisi class ke private/protected members access karne ki permission deta hai, bina us function ko member banaye. Ye bahut common hai operator overloading mein jab operator ki left side apni class ka object na ho (jaise cout << obj, jaha cout left side hai, obj nahi).

cout << obj kaam kare, iske liye operator<< ko non-member function hona zaroori hai (kyunki cout ostream class ka object hai, hamari class ka nahi) — aur agar usse hamari class ke private members chahiye, friend banana padta hai.

class Point {
  private:
    int x, y;
  public:
    Point(int x, int y) : x(x), y(y) {}

    friend ostream& operator<<(ostream &out, const Point &p);  // friend declare
};

ostream& operator<<(ostream &out, const Point &p) {
  out << "(" << p.x << ", " << p.y << ")";   // private members access, friend hone ki wajah se
  return out;
}

int main() {
  Point p(3, 4);
  cout << p << endl;   // "(3, 4)" — cout << p ab kaam karta hai!
  return 0;
}
🤝
friend function ek trusted family friend jaisa hai — normally koi outsider tumhare ghar ke private rooms mein nahi ja sakta, lekin ek trusted friend ko special permission mil sakti hai.
1 / 2
⚡ Quick Recap
  • friend = private members tak controlled access, bina member bane
  • cout << obj jaisi patterns ke liye zaroori (operator<< overloading)
  • Member nahi hai — this pointer nahi hota, normal function call syntax
Is page mein (2 subtopics)

Sirf ek function ko nahi, poori class ko bhi friend banaya ja sakta hai — us friend class ke saare member functions ab is class ke private members access kar sakte hain.

class Engine {
  private:
    int horsepower;
  public:
    Engine(int hp) : horsepower(hp) {}
    friend class Car;   // poori Car class friend hai
};

class Car {
  public:
    void showEngineDetails(Engine &e) {
      cout << e.horsepower << endl;  // private access — Car friend hai
    }
};
⚠️Common Mistake: friend relationship "mutual" nahi hoti — Engine ne Car ko friend banaya, iska matlab Car ke private members Engine access nahi kar sakta (jab tak Car bhi explicitly Engine ko friend na banaye).

friend encapsulation ko technically todता hai (private access bahar diya), isliye judiciously use karna chahiye. Justified cases: operator overloading (jaise operator<<), ya do classes jo genuinely tightly coupled hain aur ek dusre ka internal state jaanna zaroori hai (jaise LinkedList aur uska Iterator).

// Justified: Iterator ko LinkedList ke internal nodes access karne chahiye
class LinkedList {
  private:
    Node *head;
    friend class LinkedListIterator;  // tightly coupled, justified
};
💡Tip: Agar friend use karne se pehle "kya ek public method se ye kaam ho sakta hai" sochte ho, aur jawaab haan hai — public method use karo, friend nahi. friend last resort hona chahiye.