تخطَّ إلى المحتوى

friend

الدوال والأصناف الصديقة friend

friend تمنح دالة أو صنفًا خارجيًا حق الوصول للأعضاء الخاصة (private) لصنف معيّن، كاستثناء مضبوط لقاعدة التغليف.

أحيانًا دالة خارج الصنف (مثل عامل تحميل زائد operator<< للطباعة) تحتاج الوصول لأعضاء خاصة لتؤدي عملها بكفاءة. friend تعلن هذا الاستثناء صراحة داخل تعريف الصنف نفسه، فيبقى القارئ قادرًا على معرفة كل من يملك وصولًا خاصًا لمجرد قراءة تعريف الصنف — بعكس لو فتحت الأعضاء public لكل أحد.

استخدمها باعتدال: friend كثيرة تكسر فكرة التغليف تدريجيًا؛ الحالة الأشيع والمبررة هي عوامل الطباعة والمقارنة.

الصياغة

class X {
    friend ReturnType funcName(params);
    friend class OtherClass;
};

📄 مثال

class Vector2D {
    double x, y;
public:
    Vector2D(double x, double y) : x(x), y(y) {}
    friend std::ostream& operator<<(std::ostream& os, const Vector2D& v);
};

std::ostream& operator<<(std::ostream& os, const Vector2D& v) {
    return os << "(" << v.x << ", " << v.y << ")"; // وصول مباشر لـ x وy الخاصة
}

أهم النقاط

العنصرالوظيفة
friend functionدالة مستقلة تُمنح وصولًا للأعضاء الخاصة لصنف محدد
friend classصنف كامل يُمنح وصولًا لكل الأعضاء الخاصة لصنف آخر

💡 نصائح عملية

  • الاستخدام الأشهر والمبرَّر: تحميل عامل << زائد للطباعة، لأنه يجب أن يكون دالة مستقلة لا عضوًا
  • أقلل استخدام friend قدر الإمكان — كل friend جديدة تزيد الترابط بين أجزاء الكود وتُضعف التغليف

⚠️ أخطاء شائعة

  • الإفراط باستخدام friend كحل سريع بدل إعادة تصميم الواجهة العامة للصنف بشكل صحيح
  • الظن أن friend موروثة — صداقة صنف A لصنف B لا تعني أن أصناف B المشتقة صديقة لـ A تلقائيًا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.