0Pricing
C++ Academy · درس

كائنات الدوال والدوال الكائنية

اكتب أصنافًا تحتوي على operator() لإنشاء كائنات قابلة للاستدعاء وذات حالة.

كائنات الدوال والدوال الكائنية درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما هو كائن الدالة؟

كائن الدالة (functor) هو فئة تعيد تحميل operator(). ويمكن استدعاء مثيلاتها مثل الدوال.

struct Square {
    int operator()(int x) const { return x * x; }
};

Square sq;
std::cout << sq(5);   // 25

لماذا لا نستخدم دالة فحسب؟

تحمل كائنات الدالة حالة، بخلاف الدالة العادية. وتتيح الحالة إعداد الكائنات، وإجراء العدّ، وتنفيذ عمليات الاستدعاء الراجعة المعتمدة على الحالة.

struct Counter {
    int count = 0;
    int operator()(int x) { ++count; return x; }
};

Counter c;
c(10); c(20); c(30);
std::cout << c.count;   // 3

سلوك قابل للتهيئة

خزّنوا الإعدادات في أعضاء كائن الدالة. ويعمل النوع نفسه لكائن الدالة مع مجموعات متعددة من المعاملات.

struct GreaterThan {
    int threshold;
    bool operator()(int x) const { return x > threshold; }
};

GreaterThan over10{10};
over10(15);    // true
over10(5);     // false

استخدام كائنات الدالة مع خوارزميات STL

تقبل خوارزميات STL أي شيء قابل للاستدعاء، مثل كائنات الدالة ولامبدا ومؤشرات الدوال.

std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it;   // 11

كائنات الدالة المعرفة مسبقًا في <functional>

توفر المكتبة القياسية كائنات دالة جاهزة، منها: std::plus وstd::less وstd::equal_to وstd::negate وغيرها.

#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descending

كائن الدالة مقابل مؤشر الدالة

غالبًا ما تكون كائنات الدالة أفضل في التضمين البرمجي، لأن operator() الخاص بها استدعاء مباشر. أما مؤشرات الدوال فقد تكون أكثر مرونة، لكنها تستخدم استدعاءً غير مباشر.

كائنات الدالة كمعاملات للقوالب

تقبل العديد من حاويات وخوارزميات STL كائن دالة كمعامل للقالب، مثل مقارنات set ودوال التجزئة والمخصّصات.

std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1

لامبدا هي كائنات دالة

ينشئ المصرّف فئة فريدة تحتوي على operator() لكل لامبدا. ولامبدا هي صياغة مختصرة مبنية على كائنات الدالة.

متى نكتب كائن دالة

استخدموا كائن دالة مكتوبًا يدويًا عندما:

  • يُستخدم المنطق نفسه في أماكن كثيرة (فامنحوه اسمًا)
  • يكون جزءًا من واجهة برمجية عامة
  • يحتاج إلى سلوك محدد عند إنشاء النسخ أو النقل

متى نستخدم لامبدا بدلًا منه

للاستخدام مرة واحدة، تكون لامبدا أقصر وأوضح. أما للسلوك القابل لإعادة الاستخدام، فيحسّن كائن الدالة المسمى قابلية القراءة.

قابلية التركيب

يمكنكم دمج كائنات الدالة باستخدام std::bind، أو بطريقة أكثر حداثة عبر تركيب لامبدا. كما توفر مكتبات الدوال مثل Boost أدوات تركيب أيضًا.

تحقق سريع

ما القدرة الأساسية التي يملكها كائن الدالة مقارنة بالدالة العادية؟

مراجعة

كائن الدالة هو فئة تحتوي على operator(). وهو يحمل حالة، ويتكامل مع خوارزميات STL، ويُعد أساسًا للامبدا. استخدموا كائنات الدالة المسماة للسلوك القابل لإعادة الاستخدام، ولامبدا للمنطق المستخدم مرة واحدة.

الأسئلة الشائعة

هل درس «كائنات الدوال والدوال الكائنية» مجاني؟

نعم — نص درس «كائنات الدوال والدوال الكائنية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «كائنات الدوال والدوال الكائنية»؟

اكتب أصنافًا تحتوي على operator() لإنشاء كائنات قابلة للاستدعاء وذات حالة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «كائنات الدوال والدوال الكائنية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كائنات الدوال والدوال الكائنية
  2. التقاطات Lambda بالقيمة وبالمرجع وmutable
  3. ‏Lambdas العامة وعمليات الإغلاق في C++14
  4. ‏std::function والكائنات القابلة للاستدعاء بعد محو النوع
← العودة إلى C++ Academy