Friend Functions
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 = 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
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
}
};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
};