الدوال زائدة التحميل في ++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;
}
ومن هذا المثال تري أن محول صياغة السي ++ يمكنه أن يحدد من طبية البيانات المرسلة للدالة المستدعاة أية وظيفة مطلوب تنفذها . ويبين شكل تصويرا لهذا الأسلوب .
شكل زيادة تحميل الدوال
أنواع مختلفة من المعاملات
يمكن أن تصاغ الدالة الفرعية بحيث يمكن أن تتلقي أكثر من نوع من البيانات , فالمثال التالي يسمح بأن تتلقي الدالة 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
تعليقات
إرسال تعليق