مقدمة في تحميل العوامل
جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 40 من 104.
إعادة تحميل العوامل تتيح لك تحديد كيفية عمل عوامل مثل + أو - أو == عند استخدامها مع أصنافك المخصصة. وبدلًا من استدعاء أساليب مثل a.add(b)، يمكنك كتابة الصيغة الأكثر سهولة وبديهية a + b.
في C++، تُعدّ العوامل في الأساس دوالًا ذات أسماء خاصة. لتحميل عامل بشكل زائد، تُعرِّف دالةً باستخدام الكلمة المفتاحية operator متبوعةً بالرمز:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// تحميل زائد للمشغل +
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};يمكنك الآن Add متجهين بشكل طبيعي:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // يستدعي v1.operator+(v2)لا يمكن زيادة تحميل جميع المعاملات. لا يمكن زيادة تحميل معامل تحديد النطاق ::، والوصول إلى العضو .، والمعامل الثلاثي ?:، وsizeof. بالإضافة إلى ذلك، لا يمكنك إنشاء معاملات جديدة أو تغيير أسبقية أحد المعاملات - سيُقيَّم * دائمًا قبل +.
يمكن تنفيذ operators كدوال member (كما سبق) أو كدوال non-member. في الدروس القادمة، ستتعلّم متى تستخدم كل نهج وكيفية Overload لفئات محددة من operators.
التحدي
سهللنَبْنِ فئة Point تمثّل إحداثيات ثنائية الأبعاد وتدعم جمع نقطتين معًا باستخدام العامل +. هذه هي خطوتك الأولى في تحميل العوامل، مما يجعل فئاتك المخصّصة تعمل مع العوامل المألوفة.
ستنشئ ملفين لتنظيم شفرتك:
Point.h: عرّف فئةPointتخزّن إحداثيي x وy (وكلاهماint). يجب أن تحتوي فئتك على:- أعضاء private لإحداثيي x وy
- منشئ يأخذ قيمتي x وy
- دوال الحصول
getX()وgetY()(وكلاهما const) - عامل
+محمّل زائدًا يجمع نقطتين معًا ويُرجعPointجديدة بالإحداثيات combined
يجب تنفيذ العامل
+على هيئة دالة member تأخذPointأخرى باستخدام reference ثابتة وتُرجعPointجديدة. علّمها بأنهاconstلأنها لا تعدّل أيًا من operandين.main.cpp: اقرأ أربعة أعداد صحيحة من input (x1 وy1 وx2 وy2 في أسطر منفصلة) تمثّل نقطتين. أنشئ كائنَيPoint، واجمعهما معًا باستخدام العامل+، ثم اعرض results.تنسيق Output:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
الفكرة الأساسية هنا هي أن p1 + p2 يستدعي فعليًا p1.operator+(p2) في الخلفية. يتيح لك العامل المحمّل زائدًا كتابة شفرة بديهية مثل Point p3 = p1 + p2; بدلًا من شيء مثل Point p3 = p1.add(p2);.
حوّل input strings إلى أعداد صحيحة باستخدام std::stoi(). لا تنسَ header guards في ملف الترويسة.
جرّب بنفسك
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// اقرأ المدخلات
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: أنشئ كائنين من نوع Point باستخدام قيم المدخلات
// TODO: أضف النقطتين معًا باستخدام عامل التشغيل +
// TODO: أخرج النتائج بالتنسيق المطلوب:
// Point 1: (<x1>, <y1>)
// Point 2: (<x2>, <y2>)
// Sum: (<sum_x>, <sum_y>)
return 0;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامةتدرّب بنفسك: مترجم C++ عبر الإنترنت