معاملات الفهرسة واستدعاء الدوال
أعد تعريف [] و() لتتصرف الأنواع كالحاويات أو الكائنات القابلة للاستدعاء.
معاملات الفهرسة واستدعاء الدوال درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
operator[] — الوصول بالفهرس
حمّل [] زائدًا لجعل نوعك قابلًا للاستخدام مثل المصفوفة. وهذا مفيد للحاويات والمصفوفات الثنائية الأبعاد وأصناف الصور.
class Vec {
std::vector<double> data_;
public:
double& operator[](size_t i) { return data_[i]; }
double operator[](size_t i) const { return data_[i]; }
};تحميلان زائدان: const وغير const
وفّر كليهما. يؤدي الاستدعاء على نسخة من نوع const إلى اختيار التحميل الزائد الخاص بـ const، بينما يتيح النوع غير const الإسناد.
التحقق من الحدود
لا يتحقق operator[] العادي من الحدود وفقًا للعرف المتبع. وفّر دالة منفصلة باسم at() ترمي استثناءً — مثل المكتبة القياسية.
double& at(size_t i) {
if (i >= data_.size()) throw std::out_of_range("");
return data_[i];
}الفهرس المتعدد الأبعاد (C++23)
أضاف C++23 فهرسًا فرعيًا يفصل بين عناصره بفواصل: m[i, j]. أما الإصدارات الأقدم فتحتاج إلى استدعاء دالة أو إلى فهارس فرعية متسلسلة.
// C++23
double& operator[](size_t i, size_t j);
// Pre-C++23 workaround
double& operator()(size_t i, size_t j);operator() — استدعاء الدالة
حمّل () زائدًا لجعل النسخ قابلة للاستدعاء. ويُستخدم ذلك مع الكائنات الدالية وفهرسة المصفوفات ومعايير التحقق القابلة للتهيئة.
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25الكائنات الدالية ذات الحالة
يعمل معامل استدعاء الدالة مع متغيرات الأعضاء، ما يتيح إنشاء كائن قابل للاستدعاء ذي حالة.
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
std::cout << over10(15); // trueالاستخدام مع خوارزميات STL
مرّر نسخ الكائنات الدالية إلى الخوارزميات بدلًا من الدوال.
std::vector<int> v = {1, 11, 2, 22};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});معاملات متعددة الوسائط
يمكن تحميل كل من [] (قبل C++23) و() زائدًا مع أي عدد من الوسائط. ويُعد () الخيار الأكثر مرونة للوصول الشبيه بالمصفوفات الثنائية الأبعاد قبل C++23.
إرجاع المراجع مقابل القيم
أعد مرجعًا للسماح بالإسناد من خلال الفهرس الفرعي. وأعد قيمة للأنواع للقراءة فقط.
الكائنات الوسيطة
إذا احتاج operator[] إلى إرجاع كائن معقد (مثل حقل بتات)، فأعد صنفًا وسيطًا صغيرًا يحتوي على معاملات التحويل والإسناد.
أمثلة من العالم الحقيقي
الاستخدامات الشائعة:
std::vector::operator[]std::map::operator[]— يُدرج مفتاحًا عند عدم العثور عليه- أصناف المصفوفات الثنائية الأبعاد:
m(i, j) - كائنات دالة للخوارزميات
اختبار سريع
كيف تجعل نسخ الصنف قابلة للاستدعاء مثل الدالة؟
مراجعة
حمّل [] زائدًا للوصول بالفهرس (وفّر تحميلين زائدين لـ const وغير const). وحمّل () زائدًا لجعل النسخ قابلة للاستدعاء — وهو أساس الكائنات الدالية وlambdas.
الأسئلة الشائعة
هل درس «معاملات الفهرسة واستدعاء الدوال» مجاني؟
نعم — نص درس «معاملات الفهرسة واستدعاء الدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «معاملات الفهرسة واستدعاء الدوال»؟
أعد تعريف [] و() لتتصرف الأنواع كالحاويات أو الكائنات القابلة للاستدعاء. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «معاملات الفهرسة واستدعاء الدوال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- معاملات الحساب والمقارنة
- معاملات الإدراج والاستخراج من التدفق
- معاملات الفهرسة واستدعاء الدوال
- معامل المقارنة ثلاثية الاتجاه في C++20