C++ The Friend Keyword

کلمه‌ی کلیدی friend به شما اجازه می‌دهد کلاس یا تابعی را مشخص کنید که بتواند به اعضای private و protected یک کلاس دسترسی مستقیم داشته باشد.

معمولاً اعضای private فقط از داخل خود کلاس قابل دسترسی‌اند، اما با friend می‌توانیم استثنا قائل شویم.

🎯 کاربردهای اصلی

  • اجازه‌ی دسترسی یک تابع عادی (خارج از کلاس) به داده‌های خصوصی کلاس.

  • اجازه‌ی دسترسی کلاس دیگر به داده‌های خصوصی کلاس.

  • وقتی لازم است چند کلاس یا تابع، به صورت نزدیک با هم کار کنند.

🟢 1. تابع دوست (Friend Function)

یک تابع عادی را می‌توان به‌عنوان دوست یک کلاس تعریف کرد تا به اعضای private آن دسترسی داشته باشد.

#include <iostream> using namespace std; class Box { private: int width; public: Box() : width(10) {} // اعلان تابع دوست friend void printWidth(Box b); }; // تعریف تابع دوست void printWidth(Box b) { // می‌تواند به width دسترسی مستقیم داشته باشد cout << "Width: " << b.width << endl; } int main() { Box b; printWidth(b); // ✅ دسترسی به private return 0; }

📌 خروجی:

Width: 10

🟢 2. کلاس دوست (Friend Class)

یک کلاس کامل را می‌توان دوست کلاس دیگر کرد تا تمام توابع آن کلاس به اعضای private/protected کلاس دوست‌شده دسترسی داشته باشند.

#include <iostream> using namespace std; class Engine { private: int power; public: Engine(int p) : power(p) {} friend class Car; // ✅ Car دوست Engine است }; class Car { public: void showPower(Engine e) { cout << "Engine power: " << e.power << endl; // دسترسی مستقیم } }; int main() { Engine e(250); Car c; c.showPower(e); return 0; }

📌 خروجی:

Engine power: 250

🟢 3. دوست کردن تابع عضو کلاس دیگر

می‌توان یک تابع خاص از کلاس دیگر را به عنوان دوست معرفی کرد:

class A { friend void B::specificMethod(); };

🏷️ نکات مهم

  • friend قوانین OOP را نقض نمی‌کند بلکه یک استثنای کنترل‌شده است.

  • دوستی وارثی (inherited) نیست؛ اگر B دوست A باشد، فرزند B خودکار دوست A نمی‌شود.

  • دوستی دوطرفه نیست؛ اگر A دوست B باشد، B خودکار دوست A نیست (باید جداگانه تعریف شود).

  • بهتر است فقط در صورت نیاز واقعی استفاده شود تا اصل کپسوله‌سازی (Encapsulation) حفظ شود.

✅ خلاصه

ویژگیتوضیح
friend functionتابع غیرعضو که می‌تواند به private/protected دسترسی داشته باشد
friend classهمهٔ توابع یک کلاس می‌توانند به private/protected کلاس دیگر دسترسی پیدا کنند
وراثت دوستیبه ارث نمی‌رسد
دوطرفه بودندوستی یک‌طرفه است

نتیجه:
friend راهی است برای ایجاد همکاری نزدیک بین کلاس‌ها یا توابع بدون شکستن کامل اصل مخفی‌سازی، اما باید با دقت استفاده شود تا ساختار کد شلوغ و ناامن نشود.