أمثلة على وظيفة C++

Amthlt Ly Wzyft C



تسمى فئة C++ التي تعمل كدالة بـ functor. يتم استخدام بناء جملة استدعاء الوظيفة القديمة المتطابقة لاستدعاء الوظائف. نقوم بإنشاء كائن يقوم بتحميل 'المشغل ()' بشكل زائد لإنشاء عامل. يمكننا أيضًا أن نقول أن الكائنات التي يمكن تفسيرها على أنها دالة أو مؤشر دالة تسمى المؤثرين. عند نمذجة التأثيرات الوظيفية باستخدام قيم أنواع البيانات البارامترية، تكون 'الموظفون' ملائمة للغاية. في هذه المقالة، سيتم دراسة مفهوم المعامل بالتفصيل مع رموز C++.

مثال 1:

'iostream' هو ملف الرأس الذي قمنا بتضمينه هنا لأنه يتعين علينا استخدام الوظائف المعلن عنها في ملف الرأس هذا. يحتوي ملف الرأس 'iostream' على إعلان دالة. تمت إضافة مساحة الاسم 'std' هنا أيضًا. ثم نقوم بإنشاء فئة تسمى 'FunctorClass'. أسفل هذا، نكتب 'public' وهو المُنشئ العام هنا ونضع وظيفة 'operator()'. بعد ذلك، نضع الجملة التي نريد عرضها على الشاشة في عبارة 'cout'.

بعد ذلك، نسمي الدالة 'main()' ثم ننشئ كائن 'FunctorClass' بالاسم 'my_functor'. هنا، نسمي الدالة 'my_functor()' بحيث تعرض العبارة التي أضفناها أسفل الدالة 'operator()'.







الكود 1:



#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل FunctorClass {
عام :
فارغ المشغل أو العامل ( ) ( ) {
cout << 'العملية تسمى هنا' ;
}
} ;
كثافة العمليات رئيسي ( ) {
FunctorClass my_functor ;
my_functor ( ) ;

يعود 0 ;
}

انتاج:



يتم عرض السطر الذي أضفناه في وظيفة 'operator()' الخاصة بـ 'FunctorClass' هنا من خلال استخدام كائن functor 'my_functor'.





مثال 2:

لقد قمنا بتضمين ملف الرأس 'iostream' هنا نظرًا لوجود بعض إعلانات الوظائف في ملف الرأس 'iostream'. يتم أيضًا إدراج مساحة الاسم 'std'. بعد ذلك، نقوم بإنشاء فئة تسمى 'SquareClass'.



أدناه، نكتب 'public' وهو المُنشئ العام ونضع وظيفة 'operator()' لنوع البيانات 'int' أسفله. نقوم بتمرير المتغير 'val' من نوع البيانات 'int' إلى وظيفة 'operator()' هذه. تقوم هذه الوظيفة بإرجاع نتيجة الضرب كما قمنا بإدراج 'val * val' في وظيفة 'return()' أسفل وظيفة 'operator()'.

الآن، يتم استدعاء الدالة 'main()' هنا. بعد ذلك، يتم إنشاء الكائن هنا باسم 's_functor' من فئة 'SquareFunctor'. ثم نستخدم 'cout' الذي يساعد في تقديم المعلومات. بعد ذلك، نسمي الكائن 'my_functor()' هنا مثل دالة ويعيد نتيجة الضرب '5 * 5' حيث أضفنا '5' كمعامل أثناء استدعائه.

الكود 2:

#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل SquareClass {
عام :
كثافة العمليات المشغل أو العامل ( ) ( كثافة العمليات فال ) {
يعود ( فال * فال ) ;
}
} ;
كثافة العمليات رئيسي ( ) {
SquareClass s_functor ;
cout << 'مربع القيمة المعطاة هو' << endl ;
cout << s_function ( 5 ) ;

يعود 0 ;
}

انتاج:

نحصل على الإخراج بعد استدعاء كائن 'my_functor' من فئة 'SqaureClass' مثل وظيفة 'my_functor()' ثم تمرير '5'. نحصل على '25' كمربع الرقم '5'.

مثال 3:

يتم تضمين ملف الرأس 'iostream' هنا لأنه يحتوي على تعريف دالة، ويتم تقديم مساحة الاسم 'std' بعد ذلك. يتم بعد ذلك إنشاء فئة 'ProductFunctor'. يتم كتابة المنشئ العام 'public' أسفله ويتم وضع وظيفة 'operator()' لنوع البيانات 'int' أسفله. نحن نتجاوز هذه الوظيفة هنا ونمرر معلمتين إليها: 'int var1' و'int var2'.

ثم نستخدم 'الإرجاع' الموجود أسفل هذا ونضرب كلا المتغيرين مما يعيد نتيجة الضرب لكلا الرقمين 'var1 * var2'. يتم بعد ذلك استدعاء الدالة 'main()' هنا ونقوم بإنشاء كائن الفئة بالاسم 'P_functor' من فئة 'ProductFunctor'. بعد ذلك، نقوم بتهيئة متغير جديد باسم 'pro_result' ونقوم بتعيين الكائن 'P_functor' كوظيفة 'P_functor()' بعد استدعائه.

نمرر '28' و'63' كمعلمة. سيؤدي هذا إلى ضرب القيمتين وحفظ النتيجة في المتغير 'pro_result' الذي نطبعه أدناه باستخدام 'cout' وتمرير 'pro_result' فيه.

الكود 3:

#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل عامل المنتج {
عام :
كثافة العمليات المشغل أو العامل ( ) ( كثافة العمليات فار1, كثافة العمليات var2 ) {
يعود فار1 * var2 ;
}
} ;
كثافة العمليات رئيسي ( ) {
ProductFunctor P_functor ;
كثافة العمليات prod_result = وظيفة P ( 28 , 63 ) ;
cout << 'المنتج هو :' << prod_result << endl ;
يعود 0 ;
}

انتاج:

نحصل على المنتج بعد استدعاء الكائن 'P_functor' باعتباره الدالة 'P_functor()' وتمرير القيم إليه. وحاصل تلك القيم هو '1764'.

مثال 4:

يتم إنشاء 'GreetingFunctorClass' في هذه الحالة. بعد ذلك، نقوم بإدخال المنشئ 'العام' وتجاوز وظيفة 'المشغل ()' في هذا المنشئ 'العام'. نكتب 'مرحبا! أنا مبرمج C++ هنا' بعد وضع 'cout' أسفل وظيفة 'operator()'.

الآن فصاعدا، نسمي 'الرئيسية ().' نقوم بإنشاء 'g_functor' هنا ككائن من 'GreetingFunctorClass' ثم نطلق على هذا الكائن 'g_functor' وظيفة 'g_functor()'. وهذا يعطي النتيجة التي أضفناها في وظيفة 'operator()' أثناء تجاوزها.

الكود 4:

#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل GreetingFunctorClass {
عام :
فارغ المشغل أو العامل ( ) ( ) {
cout << 'مرحبًا! أنا مبرمج C++ هنا' ;
}
} ;
كثافة العمليات رئيسي ( ) {
GreetingFunctorClass g_functor ;
g_function ( ) ;
يعود 0 ;
}

انتاج:

هنا، قد نلاحظ أن العبارة التي أضفناها عندما قمنا بتجاوز وظيفة 'operator()' في الكود الخاص بنا يتم عرضها هنا عندما نطلق على كائن الفئة مثل الوظيفة.

مثال 5:

تم تضمين 'bits/stdc++.h' هذه المرة لأنه يحتوي على جميع إعلانات الوظائف الضرورية. ثم يتم وضع مساحة الاسم 'std' هنا. الفئة التي نقوم بإنشائها هنا هي فئة 'incrementFunctor'. بعد ذلك، نقوم بإنشاء مُنشئ 'خاص' وتهيئة المتغير 'int_num' بنوع البيانات 'int'.

تحت هذا المنشئ 'العام'، نضع 'incrementFunctor' ونمرر 'int n1' بداخله. ثم نكتب 'int_num(n1)' بعد وضع ':'. بعد ذلك، نتجاوز الوظيفة التي هي وظيفة 'operator()' لنوع البيانات 'int' ونعلن عن 'int arrOfNum' هنا. ثم نستخدم 'return' ونقوم بإدراج 'int_num + arrOfNum'. الآن، يؤدي هذا إلى زيادة قيم 'arrOfNum'، ويضيف قيمة 'int_num' إليها، ويعيدها هنا.

بعد استدعاء 'main()'، نقوم بتهيئة 'arrOfNum' وتعيين قيم أعداد صحيحة مختلفة هنا. بعد ذلك، تتم تهيئة المتغير 'n1' حيث نضيف الدالة 'sizeof' مثل 'sizeof(arrOfNum)/sizeof(arrOfNum[0])'. بعد ذلك، تتم تهيئة 'رقم الإضافة' بالرقم '3'. الآن، نستخدم وظيفة 'التحويل ()'. هذا 'transform()' هو نفس إنشاء كائن من فئة 'increamentFunctor' ثم استدعاء كائنه. بعد ذلك، نستخدم حلقة 'for' ثم 'cout' في 'arrOfNum[i]'.

الكود 5:

#تتضمن
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل incrementFunctor
{
خاص :
كثافة العمليات int_num ;
عام :
incrementFunctor ( كثافة العمليات ن1 ) : int_num ( ن1 ) { }
كثافة العمليات المشغل أو العامل ( ) ( كثافة العمليات رقم الوصول ) مقدار ثابت {
يعود int_num + رقم الوصول ;
}
} ;
كثافة العمليات رئيسي ( )
{
كثافة العمليات رقم الوصول [ ] = { 6 , 3 , 2 , 1 , 9 , 0 , 8 } ;
كثافة العمليات ن1 = حجم ( رقم الوصول ) / حجم ( رقم الوصول [ 0 ] ) ;
كثافة العمليات رقم الاضافة = 3 ;
تحول ( رقم الوصول، رقم الوصول + n1, arrOfNum, incrementFunctor ( رقم الاضافة ) ) ;

ل ( كثافة العمليات أنا = 0 ; أنا < ن1 ; أنا ++ )
cout << رقم الوصول [ أنا ] << ' ' ;
}

انتاج:

تظهر نتيجة الكود هنا حيث يكون 'incrementFunctor' هو 'Functor' الذي يتم استخدامه كوظيفة.

مثال 6:

في هذا الكود، نستخدم الدالة 'الأكبر' المحددة مسبقًا. هنا، قمنا بتضمين أربعة ملفات رأسية مختلفة كما نطلبها في الكود الخاص بنا لأن الوظائف أو الأساليب التي نحتاجها في الكود الخاص بنا مُعلن عنها فيها. بعد ذلك، بعد إضافة 'std' ثم استدعاء 'main()'، نقوم بتهيئة المتجه 'myIntegerVector'. نقوم بإدراج بعض القيم غير المصنفة في هذا المتجه. أسفل هذا، نطبق وظيفة 'الفرز' لفرز قيم المتجهات هذه.

عندما نستخدم هذه الوظيفة، فإنها تقوم بفرز القيم بترتيب تصاعدي. لكننا نستخدم 'الأكبر' هنا وهي الوظيفة المحددة مسبقًا في لغة C++ والتي تعطي نتيجة الفرز بطريقة تنازلية. بعد ذلك، نقوم بعرض القيم التي تم فرزها بمساعدة حلقة 'for' ثم 'cout'.

الكود 6:

#تشمل
#تشمل <الخوارزمية>
#تشمل <ناقل>
#تشمل <وظيفية>
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

كثافة العمليات رئيسي ( ) {
المتجه < كثافة العمليات > myIntegerVector = { 13 , واحد وعشرين , 19 , 44 , 32 , 42 , 9 , 6 } ;
نوع ( myIntegerVector. يبدأ ( ) ، myIntegerVector. نهاية ( ) أعظم < كثافة العمليات > ( ) ) ;
ل ( كثافة العمليات vec_num : myIntegerVector ) {
cout << vec_num << '' ;
}
يعود 0 ;
}

انتاج:

يتم فرز جميع قيم المتجه بطريقة تنازلية بمساعدة العامل المحدد مسبقًا في لغة C++ وهو العامل 'الأكبر'، وتعريفه متاح في ملف الرأس 'الوظيفي'.

خاتمة

تم استكشاف مفهوم 'functor C++' بعمق في هذه المقالة. لقد درسنا أنه يمكن استدعاء كائن كدالة لزيادة التحميل على وظيفة تسمى 'operator()'. ويعرف هذا باسم functor. يجب توفير الوصول العام من أجل التحميل الزائد على 'المشغل ()' لاستخدامه على النحو المنشود. لقد أوضحنا أمثلة مختلفة استخدمنا فيها 'الوظائف' و'الوظائف' المحددة مسبقًا في الكود الخاص بنا.