الدوال زائدة التحميل في ++C

الدوال زائدة التحميل

الدالة زائدة التحميل overloaded هي دالة يمكنها القيام بأكثر من وظيفة , طبقا لطبيعة البيانات المرسلة إليها . وفكرة زيادة التحميل تماثل التساؤل الذي تساءله أحد الأذكياء مندهشا عن طريقة عمل الثرموس ؛ إنه يحفظ السائل الساخن ساخنا , والبارد باردا فكيف يميز بين الحالتين .

وقد يبدو مستغربا بنفس المنطق كيف تعرف الدالة المطلوب منها , فهي تنفذ عملية ما علي نوع ما من البيانات , ثم تنفذ عملية أخري علي نوع أخر , والمثال التالي يبين الفكرة ؛

معاملات بأعداد مختلفة

هل تتذكر الدالة starline() في البرنامج table.cpp والدالة repchar() في البرنامج tablearg() المقدمين في بداية الفصل ؟ كانت الدالة الأولي تطبع 45 نجمة , أما الثانية فكانت تطبع أحرفا توصف عند استدعائها نوعا وعددا . وقد نتصور دالة ثالثة , charline() تطبع العدد ثابتا (45 حرفا) يوصف نوعهم عند الاستدعاء . لدينا إذن ثلاثة دوال متشابهة في الوظيفة , ولكل دالة اسم علي المبرمج أن يتذكرها جميعا . وكم يكون من الأسهل لو اختيرت لها جميعا اسما واحدا , حتي وإن كانت وظائفها مختلفة , وإليك أسلوب تحقيق ذلك .

overload.cpp


 


// overload.cpp


// demonstrates function overloading


// UCS Laboratories


#include <iostream.h>


#include <conio.h>


 


void repchar();


void repchar(char);


void repchar(char, int);


 


void main()


   {


   repchar();


   repchar('=');


   repchar('+', 30);


   getche();


   }


 


// repchar()


// displays 45 asterisks


void repchar()


   {


   for(int j=0; j<45; j++)  // always loops 45 times


      cout << '*';          // always prints asterisk


   cout << endl;


   }


 


// repchar()


// displays 45 copies of specified character


void repchar(char ch)


   {


   for(int j=0; j<45; j++)  // always loops 45 times


      cout << ch;           // prints specified character


   cout << endl;


   }


 


// repchar()


// displays specified number of copies of specified character


void repchar(char ch, int n)


   {


   for(int j=0; j<n; j++)   // loops n times


      cout << ch;           // prints specified character


   cout << endl;


   }




ومن هذا المثال تري أن محول صياغة السي ++ يمكنه أن يحدد من طبية البيانات المرسلة للدالة المستدعاة أية وظيفة مطلوب تنفذها . ويبين شكل تصويرا لهذا الأسلوب .



Object-Oriented Programming in C   _Page_0217_Image_0001























شكل زيادة تحميل الدوال



أنواع مختلفة من المعاملات



يمكن أن تصاغ الدالة الفرعية بحيث يمكن أن تتلقي أكثر من نوع من البيانات , فالمثال التالي يسمح بأن تتلقي الدالة engdisp() إما بيانا هيكليا أو من نوع العدد الكسري , وفي الحالة الأولي تظهره كما هو , وفي الحالة الثانية تتلقي المسافة بالبوصات وتظهرها علي الصورة التقليدية .






overengl.cpp


 


// overengl.cpp


// demonstrates overloaded functions


// UCS Laboratories


#include <iostream.h>]


#include <conio.h>


 


struct Distance               // English distance


   {


   int feet;


   float inches;


   };


 


void engldisp( Distance );     // declarations


void engldisp( float );


 


void main()


   {


   Distance ucs1;                // distance of type Distance


   float ucs2;                   // distance of type float


                   // get length ucs1 from user


   cout << "\nEnter feet: ";  cin >> ucs1.feet;


   cout << "Enter inches: ";  cin >> ucs1.inches;


                   // get length ucs2 from user


   cout << "Enter entire distance in inches: "; cin >> ucs2;


 


   cout << "\nucs1 = ";


   engldisp(ucs1);               // display length 1


   cout << "\nucs2 = ";          


   engldisp(ucs2);               // display length 2


   getche();


}


 


// engldisp()


// display structure of type Distance in feet and inches


void engldisp( Distance ucs )   // parameter ucs of type Distance


   {


   cout << ucs.feet << "\'-" << ucs.inches << "\"";


   }


 


// engldisp()


// display variable of type float in feet and inches


void engldisp( float ucs )   // parameter ucs of type float


   {


   int feet = ucs / 12;


   float inches = ucs - feet*12;


   cout << feet << "\'-" << inches << "\"";


   }




وإليك مثالا للحوار بين المستخدم والبرنامج :



Enter feet:5



Enter inches:10.5



D1 = 5 10.5



D2 = 6 4.5

التسميات: