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 الكامل بالعربي.