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

operator

تحميل العوامل زائدًا operator

تحميل العوامل زائدًا يعيد تعريف سلوك عوامل مثل + و== و<< لتعمل بشكل طبيعي مع أنواعك المخصّصة، تمامًا كما تعمل مع الأنواع الأساسية.

بدون تحميل زائد، جمع كائنين من صنف Vector2D يحتاج دالة صريحة مثل add(a, b) بدل a + b الطبيعي. C++ تسمح بإعادة تعريف معظم العوامل (+، -، ==، <<، []، ()، وغيرها) كدوال أعضاء أو دوال مستقلة، فتصبح أنواعك المخصّصة تتصرف بانسجام مع بقية اللغة. الأشيع: عامل << للطباعة (يحتاج friend لأنه دالة مستقلة)، وعامل == للمقارنة، وعامل [] للوصول كمصفوفة بأنواع مثل حاويات مخصّصة.

الصياغة

ReturnType operator+(const Type& other) const;
friend std::ostream& operator<<(std::ostream& os, const Type& obj);

📄 مثال

class Vector2D {
    double x, y;
public:
    Vector2D(double x, double y) : x(x), y(y) {}

    Vector2D operator+(const Vector2D& o) const {
        return Vector2D(x + o.x, y + o.y);
    }
    bool operator==(const Vector2D& o) const {
        return x == o.x && y == o.y;
    }
};

Vector2D a(1, 2), b(3, 4);
Vector2D c = a + b; // (4, 6) عبر operator+
bool eq = (a == b); // false عبر operator==

أهم النقاط

العنصرالوظيفة
operator+، operator-العوامل الحسابية — تُعرَّف عادة كدوال أعضاء تُرجع كائنًا جديدًا
operator==، operator!=عوامل المقارنة — أساسية لاستخدام النوع بحاويات STL كالمقارنة والبحث
operator<< (friend)عامل الطباعة، يجب أن يكون دالة مستقلة (friend) لأن الطرف الأيسر هو std::ostream وليس صنفك
operator[]يجعل الكائن يُستخدم بصيغة obj[index] مثل المصفوفات والحاويات

💡 نصائح عملية

  • لا تحمّل عاملًا زائدًا إلا إذا كان معناه طبيعيًا وواضحًا لقرّاء الكود — عامل + على صنف لا يمثّل شيئًا قابلًا للجمع يسبب ارتباكًا
  • إذا حمّلت operator== فكّر بتحميل operator!= أيضًا (أو استخدم = default بـ C++20 لتوليدها تلقائيًا)

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

  • تحميل عامل بسلوك غير متوقّع منطقيًا (مثل + يطرح بدل يجمع) — يربك أي مبرمج آخر يقرأ الكود
  • نسيان جعل operator<< دالة friend مستقلة ومحاولة تعريفه كدالة عضو — لا يترجم لأن std::ostream يجب أن يكون الطرف الأيسر

خصائص ذات صلة

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