التحميل الزائد
إن التحميل الزائد للمشغل في لغة C++ هو ميزة تسمح لك بإعادة تعريف سلوك المشغلين (مثل +، -، *، /، وما إلى ذلك) للأنواع المحددة من قبل المستخدم. فهو يمكّنك من توسيع وظائف المشغلين للعمل مع كائنات من فئاتك الخاصة.
مثال 1:
#include <iostream> using namespace std; class triangle { private: float width, height; public: triangle(float a = 0, float b = 0) { width = a; height = b; } void getdata() { cout << "Enter width \n"; cin >> width; cout << "Enter height \n"; cin >> height; } void showdata() { cout << "width and height = (" << width << "," << height << ")" << endl; } void add(triangle c1, triangle c2) { width = c1.width + c2.width; height = c1.height + c2.height; } }; int main() { triangle c1, c2(3.5, 1.5), c3; c1.getdata(); c3.add(c1, c2); c3.showdata(); return 0; }
يحدد برنامج C++ هذا الفئة triangle التي تمثل مثلثًا. تحتوي على عرض وارتفاع أعضاء البيانات الخاصة، ومنشئ لتهيئتهم، ودوالالأعضاء getdata لإدخال قيم العرض والارتفاع، وإظهار البيانات لعرض العرض والارتفاع، والإضافة لإضافة مثلثين معًا.
تعريف الـclass:
- يتم تعريف triangle class بعرض وارتفاع أعضاء البيانات الخاصة.
- يحتوي على constructor يقوم بتهيئة العرض والارتفاع بالقيم الافتراضية 0.
- يحتوي على دوال الأعضاء getdata، showdata، والإضافة.
الدالة الرئيسة main:
- في الدالة الرئيسية، يتم إنشاء ثلاثة (triangle objects): c1 وc2 وc3.
- تتم تهيئة c1 بالقيم الافتراضية باستخدام default constructor.
- تتم تهيئة c2 بالقيمتين 3.5 و1.5 باستخدام parameterized constructor.
- يتم إنشاء c3 دون أي تعريف مسبق.
- يتم استدعاء getdata لـ c1 لإدخال قيم العرض والارتفاع.
- يتم استدعاء الإضافة لـ c3 مع c1 وc2 كـarguments، مما يضيف العرض والارتفاع المقابلين لـ c1 وc2 ويعين النتيجة إلى c3.
- يتم استدعاء showdata لـ c3 لعرض العرض والارتفاع الناتج بعد الإضافة.
مثال 2:
#include <iostream> using namespace std; class triangle { private: float width, height; public: triangle(float a = 0, float b = 0) { width = a; height = b; } void getdata() { cout << "Enter width \n"; cin >> width; cout << "Enter height \n"; cin >> height; } void showdata() { cout << "width and height = (" << width << "," << height << ")" << endl; } triangle add(triangle c2) { triangle c3; c3.width = width + c2.width; c3.height = height + c2.height; return c3; } }; int main() { triangle c1, c2(3.5, 1.5), c3; c1.getdata(); c3 = c1.add(c2); c3.showdata(); return 0; }
في هذا المثال، يتم أيضًا إجراء عملية إضافة مثلثين باستخدام دالة عضو تسمى add. ومع ذلك، بدلاً من تعديل الكائن الذي يتم استدعاء الدالة عليه، يتم إنشاء كائن مثلث جديد داخل دالة الإضافة لتخزين نتيجة الإضافة. يتم بعد ذلك إرجاع هذا الكائن الجديد من الدالة، مع ترك الكائنات الأصلية دون تغيير.
مثال 3:
#include <iostream> using namespace std; class triangle { private: float width, height; public: triangle(float a = 0, float b = 0) { width = a; height = b; } void getdata() { cout << "Enter width \n"; cin >> width; cout << "Enter height \n"; cin >> height; } void showdata() { cout << "width and height = (" << width << "," << height << ")" << endl; } triangle operator+(triangle c2) // Overloading the + operator { triangle c3; c3.width = width + c2.width; c3.height = height + c2.height; return c3; } }; int main() { triangle c1, c2(3.5, 1.5), c3; c1.getdata(); c3 = c1 + c2; // Using the overloaded + operator c3.showdata(); return 0; }
يوضح برنامج C++ هذا استخدام التحميل الزائد للمشغل لإجراء عملية الجمع بين كائنين مثلثين. دعنا نحلل الكود ونسلط الضوء على الاختلافات مقارنة بالأمثلة السابقة:
الاختلافات مقارنة بالأمثلة السابقة:
- التحميل الزائد:
في هذا المثال، يتم تحميل عامل التشغيل + بشكل زائد باستخدام دالة عضو تسمى operator+. يتيح لنا ذلك إجراء عملية الجمع بين كائنين مثلثين باستخدام العامل + بطريقة مشابهة للـbuilt-in types.
في المقابل، استخدمت الأمثلة السابقة دوال الأعضاء (add) لإجراء عملية الجمع بين الكائنات. - الإستخدام في الدالة الرئيسة main:
في الدالة الرئيسية، يتم تنفيذ إضافة c1 وc2 باستخدام + operator: c3 = c1 + c2;.
يعد بناء الجملة هذا أكثر سهولة وإيجازًا مقارنة باستدعاء دالة عضو منفصلة (add). - نوع الإسترجاع return:
تقوم الدالة operator+ بإرجاع triangle object يمثل نتيجة عملية الإضافة.
في الأمثلة السابقة، لم تُرجع دوال الإضافة أي قيمة، وبدلاً من ذلك قامت بتعديل أحد الـobjects مباشرةً.