تحميل زائد للعملية

من أرابيكا، الموسوعة الحرة
اذهب إلى التنقل اذهب إلى البحث

في برمجة الحاسوب، يعد تحميل زائد للعملية (بالإنجليزية: operator overloading)‏، والذي يطلق عليه أحيانًا تعدد الأشكال المخصص للمشغل، حالة محددة من تعدد الأشكال، حيث يكون لدى العوامل المختلفة تنفيذات مختلفة اعتمادًا على قيمهم (arguments). يتم تعريف التحميل الزائد للمشغل بشكل عام بلغة برمجة أو بواسطة مبرمج أو كليهما.

الدافع

عامل التحميل الزائد هو تجميل (سُكر) للبنية نحوي، ويستخدم لسماحه للبرمجة باستخدام التدوين الأقرب إلى نطاق الهدف ويسمح للأنواع المعرّفة من قبل المستخدم بمستوى مماثل من الدعم النحوي مثل الأنواع المضمنة في اللغة.[1] يعتبر ذلك شائعاً، على سبيل المثال، في الحوسبة العلمية، حيث يسمح ذلك بمعالجة أو التلاعب بتمثيلات الحوسبة للكائنات الرياضية بنفس البنية النحوية كما في الورق. لا يؤدي عامل التحميل الزائد إلى تغيير القوة التعبيرية للغة (للدوال)، حيث يمكن محاكاتها باستخدام استدعاءات الدوال. على سبيل المثال، ضع في الاعتبار المتغيرات أ، ب، ج لبعض الأنواع المعرفة من قبل المستخدم ، مثل المصفوفات:

a, b, c

في لغة تدعم عامل التحميل الزائد، ومع الافتراض المعتاد بأن عامل التشغيل * له أسبقية أعلى من عامل التشغيل +، فهذه طريقة موجزة للكتابة:

Add(a, Multiply(b, c))

ومع ذلك ، فإن الصيغة النحوية السابقة تعكس الاستخدام الرياضي الشائع.

أمثلة

في هذه الحالة، يتم تحميل عامل التشغيل الزائد للسماح بالإضافة على نوع وقت "Time" معرّف من قبل المستخدم (في سي++):

Time operator+(const Time& lhs, const Time& rhs) {
 Time temp = lhs; 
 temp.seconds += rhs.seconds;
 temp.minutes += temp.seconds / 60;
 temp.seconds %= 60;
 temp.minutes += rhs.minutes;
 temp.hours += temp.minutes / 60;
 temp.minutes %= 60;
 temp.hours += rhs.hours;
 return temp;
}

الإضافة هي عملية ثنائية، مما يعني أن لها معاملين . في سي++، القيم التي يتم تمريرها هي العوامل، والكائن temp هو القيمة التي تم إرجاعها. يمكن أيضًا تعريف العملية كطريقة صنف واستبدال lhs بالقيمة الخفية this؛ لكن هذا يجبر المعامل الأيسر على أن يكون من النوع Time :

// This "const" means that |this| is not modified.
// \
// ------------------------------------\
//
// V
Time Time::operator+(const Time& rhs) const {
 Time temp = *this; // Copy |this| which is not to be modified.
 temp.seconds += rhs.seconds;
 temp.minutes += temp.seconds / 60;
 temp.seconds %= 60;
 temp.minutes += rhs.minutes;
 temp.hours += temp.minutes / 60;
 temp.minutes %= 60;
 temp.hours += rhs.hours;
 return temp;
}

لاحظ أن العامل الأحادي المحدد كطريقة صنفية لن يتلقى أي قيمة واضحة (يعمل فقط من this):

bool Time::operator!() const {
 return hours == 0 && minutes == 0 && seconds == 0;
}

غالبًا ما يكون عامل أصغر من (>) محمل بشكل زائد لفرز بنية أو صنف.

class Pair {
 public:
 bool operator<(const Pair& p) const {
  if (x_ == p.x_) {
   return y_ < p.y_;
  }
  return x_ < p.x_;
 }

 private:
 int x_;
 int y_;
};

في المثال الأخير، يتم التحميل الزائد للعامل داخل الصنف التي هي نفس الأمثلة السابقة. في سي++، بعد التحميل الزائد لعامل أقل من عامل التشغيل (>) ، يمكن استخدام دوال الفرز القياسية لفرز بعض الأصناف.

انظر أيضًا

المراجع

  1. ^ "[13] Operator overloading  Updated! , C++ FAQ". web.archive.org. 14 أغسطس 2011. مؤرشف من الأصل في 2020-08-22. اطلع عليه بتاريخ 2020-07-26. {{استشهاد ويب}}: no-break space character في |عنوان= في مكان 27 (مساعدة)صيانة الاستشهاد: BOT: original URL status unknown (link)