مواقع أخرى
الأخبار
BBC عربي
CNN عربي
الصحف
الجامعات
جامعة الملك سعود
جامعة الملك عبد العزيز
الرياضة
الدوال الصديقة
Friend Functions
تعريف الدالة الصديقة:-
هي عبارة عن دالة لا تنتمي لصنف معين ولكننا نحتاج إليها للوصول إلى خصائص ذلك الصنف.
تعريف آخر:
هي دالة معرفة خارج الصنف مع امتيازها بالوصول إلى أعضاء الصنف .
أعلى
مثال توضيحي:-
class ff
{
private:
int x;
public:
ff( )
x=0;
}
void set(int y)
x=y;
};
إذا كتبنا قبل البرنامج الرئيسي ما يلي:-
void plus(ff f)
// ff كائن من نوع الصنف f ;
cout<<f.x+5;
// خاصية ( متغير)x ;
فهذه الطريقة خاطئة لأنه لا يمكن الوصول إلى المتغير x وذلك لان الدالة plus ليست عضو في الصنف ff
وحتى تتمكن الدالة plus من الوصول إلى خصائص الصنف يجب الإعلان عنها كدالة صديقة داخل الصنف ff
ويتم الإعلان عنها داخل الصنف باستخدام الكلمة المحجوزة friend كالتالي:-
""""
friend void plus(ff )
// إعلان فقط دون كتابة تفاصيل
// لا تكتب تفاصيل الدالة الصديقة داخل الصنف
كيفية استدعاء الدالة الصديقة:-
main( )
// اشتقاق كائن من نوع الصنف
ff f1;
// استدعاء دالة عضو في الصنف
f1.set( 50 );
// استدعاء الدالة الصديقة ووسيطة
// الاستدعاء عبارة عن كائن من نوع الصنف
plus(f1)
ملاحظات:-
1. الدالة الصديقة لها امتيازات الدالة العضو أي لها القدرة على الوصول إلى خصائص(متغيرات) الصنف
2. الدالة الصديقة يتم تعريفها داخل الصنف باستخدام الكلمة المحجوزة friend
3. يتم استدعاء الدالة الصديقة داخل البرنامج الرئيسي عن طريق اسمها والوسيطة ( الوسيطة عبارة عن كائن من نفس الصنف)
4. لا يستخدم المؤشر This مع الدالة الصديقة لأننا أصلاً لن نستدعي الدالة عن طريق الكائن
5. لا تعتبر الدالة الصديقة عضو من أعضاء الصنف ولذلك من الخطأ استدعاؤها باستخدام اسم الكائن وأداة الوصول (.)
والآن نكتب البرنامج بصورة متكاملة:-
#include<iostream.h>
#include<conio.h>
ff()
friend void plus(ff);
} ;
f1.set(50);
plus(f1);
getch( );
مثال1:-
برنامج يقوم بمقارنة نصفي قطري
دائرتين باستخدام الدالة الصديقة
class circle
float ar,c;
int radius;
circle( )
radius=0;
circle(int r)
radius=r;
void area( );
void cir( );
void display( );
friend compare(circle,circle);
void circle::area( )
ar=radius*radius*3.14;
void circle::cir( )
c=2*radius*3.14;
void circle::display( )
cout<<"area ="<<ar<<"\n";
cout<<"cir ="<<c<<"\n";
compare(circle c1,circle c2)
return(c1.radius>c2.radius);
int r1, r2;
cout<<"enter radius 1\n";
cin>>r1;
cout<<"enter radius 2\n";
cin>>r2;
circle c1(r1),c2(r2);
c1.area( );
c1.cir( );
c2.area( );
c2.cir( );
c1.display( );
c2.display( );
if(compare(c1,c2))
cout<<c1.radius<<"is greater";
else
cout<<c2.radius<<"is greater";
مثال آخر عن الدالة الصديقة :-
// friend functions
#include <iostream.h>
class crectangle
int width, height;
void set_values (int, int);
int area (void)
return (width * height);
friend crectangle duplicate (crectangle);
void crectangle::set_values (int a, int b)
width = a;
height = b;
crectangle duplicate (crectangle rectparam)
crectangle rectres;
rectres.width = rectparam.width*2;
rectres.height = rectparam.height*2;
return (rectres);
main ( )
crectangle rect, rectb;
rect.set_values (2,3);
rectb = duplicate (rect);
cout << rectb.area( );
خلاصة القول:-
1. الدالة الصديقة لها نفس امتياز الدالة العضو حيث يتم تعريفها داخل الصنف باستخدام الكلمة المحجوزة friend ويتم استدعاؤها بالطريقة التالية:-
Function name(Object name);
2. تعرف الدالة الصديقة في أي مكان داخل الصنف
الوحدة التالية >>
جميع الحقوق محفوظة © 2006