الوحدة الثامنة:::::من الدروس

محتويات الوحدة
 
الدوال الصديقة
مثال توضيحي
أمثلة
 
 
 
 
 
 
 
 
وحدات اخرى
 
  الوحدة الأولى
  الوحدة الثانية
  الوحدة الثالثة
  الوحدة الرابعة
  الوحدة الخامسة
  الوحدة السادسة
  الوحدة السابعة
  الوحدة الثامنة
  الوحدة التاسعة
  الوحدة العاشرة
  الوحدة الحادية عشر
  الوحدة الثـانية عشر
  الوحدة الثالثة عشر
  الوحدة الرابعة عشر
 

 مواقع أخرى

 

الأخبار

 
  الجزيرة
  العربية

  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 كالتالي:-

class ff

{

""""

""""

""""

""""

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>

class ff

{

private:

int x;

public:

ff()

{

x=0;

}

void set(int y)

{

x=y;

}

friend void plus(ff);

} ;

void plus(ff   f)

{

cout<<f.x+5;

}

main(  )

{

ff  f1;

f1.set(50);

plus(f1);

getch(  );

}

 

 
 
 

 أعلى

 

 

   
 أمثلة:-

مثال1:-

برنامج يقوم بمقارنة نصفي قطري

دائرتين باستخدام الدالة الصديقة

 

#include<iostream.h>

#include<conio.h>

class circle

{

private:

float ar,c;

public:

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);

}

main(  )

{

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";

getch(  );

}

 

مثال آخر عن الدالة الصديقة :-

 

// friend functions

#include <iostream.h>

#include<conio.h>

 class crectangle

 {

    int width, height;

  public:

    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(  );

  getch(  );

}

خلاصة القول:-

1.    الدالة الصديقة  لها نفس امتياز الدالة العضو حيث يتم تعريفها داخل الصنف باستخدام الكلمة المحجوزة friend ويتم استدعاؤها بالطريقة التالية:-

Function name(Object name);

2.   تعرف الدالة الصديقة في أي مكان داخل الصنف

 
 
  << الوحدة السابقة

 أعلى

الوحدة التالية >>

 

                                                             

 
   
 

جميع الحقوق محفوظة © 2006