الدوال زائدة التحميل في ++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 asterisksvoid repchar() {for(int j=0; j<45; j++) // always loops 45 times
cout << '*'; // always prints asterisk
cout << endl;
}
// repchar()// displays 45 copies of specified charactervoid repchar(char ch)
{for(int j=0; j<45; j++) // always loops 45 times
cout << ch; // prints specified charactercout << endl;
}
// repchar()// displays specified number of copies of specified charactervoid repchar(char ch, int n)
{for(int j=0; j<n; j++) // loops n times
cout << ch; // prints specified charactercout << endl;
}
ومن هذا المثال تري أن محول صياغة السي ++ يمكنه أن يحدد من طبية البيانات المرسلة للدالة المستدعاة أية وظيفة مطلوب تنفذها . ويبين شكل تصويرا لهذا الأسلوب .
شكل زيادة تحميل الدوال
أنواع مختلفة من المعاملات
يمكن أن تصاغ الدالة الفرعية بحيث يمكن أن تتلقي أكثر من نوع من البيانات , فالمثال التالي يسمح بأن تتلقي الدالة 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 Distancefloat 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 2getche();
}
// engldisp()// display structure of type Distance in feet and inchesvoid engldisp( Distance ucs ) // parameter ucs of type Distance
{cout << ucs.feet << "\'-" << ucs.inches << "\"";
}
// engldisp()// display variable of type float in feet and inchesvoid 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
تعليقات
إرسال تعليق