الاثنين، 30 مايو 2011

مقالات : دوال البناء والهدم


** دوال البناء والهدم ::

أولا: دوال البناء
Constructor Function .:::

هي عبارة عن دالة تحمل نفس اسم الصنف
ويتم استدعاؤها مباشرة عند اشتقاق كائن من الصنف وتستخدم غالباً لإعطاء خصائص ( متغيرات ) الصنف قيم ابتدائية .

- ملاحظات :

1- لا يمكن تهيئة البيانات العضو أثناء التعريف .
2- لا يوجد مردود (
return ) لدوال البناء .
3- يمكن أن يحوي الصنف أكثر من دالة بناء ( التحميل الزائد للدوال ).

** مثال توضيحي لمؤثر دقة الوصول ودوال البناء .:



كود
PHP:
#include <iostream.h>
#
include <cstdlib>
using namespace std ;
//انشاء صنف باسم MYCLASS
class myclass
{
int a;
public:
myclass();
void show();
};
myclass::myclass()
{
cout<<"Constructor Function \n";
a=10;
}
void myclass::show()
{
cout<<"a="<<a<<"\n";
}
int main()
{
myclass ob;
ob.show();

system("PAUSE");
return 0;
والان شرح بسيط لاهم ما ورد في الكودالسابق :
1.    كود PHP:
myclass();

الاعلان عن
دالة بناء ( لان اسمها من اسم الصنف ) ولاحظ اننا وضعنا في نهاية تعريف الدالة فاصلة منقوطة ( ; ) وهذه نضعها في حال لم نريد كتابة تفاصيل الدالة داخل الصنف .
1.    كود PHP:
myclass::myclass()

لاحظ اننا كتبنا هذا الكود بعد اقفال الكلاس .
لكتابة تفاصيل الدالة خارج الصنف نستخدم هذه الطريقة بحيث في البداية كتبنا اسم الصنف
myclass ومن ثم مؤثر دقة الوصول وهو ( :: ) ومن ثم اسم الدالة myclass().(لاحظ هنا اننا نتحدث عن دالة البناء ، ودالة البناء ليس لها DataType عكس دالة show التي سترد الان ) .
1.   
كود
PHP:
void myclass::show()


لاحظ هنا في البداية نكتب نوع الدالة
DataType وهو Void الموجود في دالة show ، ومن ثم اسم الصنف ومؤثر دقة الوصول واسم الدالة ( كما في الدالة السابقة)
1.    ** دالة الهدمDestructor Function :

هي عبارة عن دالة
عضو في الصنف ، ويتشكل اسمها من المحرف ( ~ ) مضافاً إليه اسم الصنف . وتستخدم لإنهاء الأعمال الداخلية للكائنات حتى يستطيع النظام استعادة الذاكرة لحفظ كائنات جديدة .

ملاحظات على دالة الهدم :

1- ليس لها وسائط ، ولا ترجع فيمة .
2- يمكن للصنف أن يحتوي على دالة هدم واحدة فقط .
3- لا يمكن تحميل دالة الهدم بشكل زائد.
** استخدام الوساط ( التلقائية ) الإفتراضية مع دالة :

يمكن أن يستخدم أي نوع أو أي عدد من المعاملات ( الوسائط) داخل دالة البناء ، في هذه الحالة يتم استدعاء دالة البناء للكائنات ذات المعاملات التي تتناسب مع عدد المعاملات الموجودة داخل دالة البناء .







مثال .:





1.    كود PHP:
#include <iostream.h>
#
include <cstdlib>
using namespace std ;
class myclass
{
private:
int x,y;
public:
myclass()
{
x=y=1;
}
myclass(int a ,int b)
{
x=a;
y=b;
}
void display()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
};

int main()
{
int n,m;
cin>>n>>m;
myclass ob1;
ob1.display();
myclass ob2(n,m);
ob2.display();
system("PAUSE");
return 0;
}





1.     
توضيح بسيط لأهم ما ورد في هذا الكود :

في البداية يطلب البرنامج من المستخدم ادخال عددين ليسجلهما في المتغيرين m,n ..
و عند اشتقاق الكائن الأول وهو ob1 كما يظهر هنا ::..

كود
PHP:
myclass ob1;
فإنه يتم مباشرة استدعاء التعليمات المكتوبة داخل دالة البناء myclass وهي ::.
1.   
كود
PHP:
myclass()
{
x=y=1;
}

أي يجعل قيمة x و y تساوي العدد ( 1 ) .
ومن ثم استدعاء دالة الطباعة للكائن ob1 كما في هذا الشكل :.
1.    كود PHP:
ob1.display();

بعد ذلك تم اشتقاق كائن اخر من الصنف myclass باسم ob2 وله وسيطتين وهما العددين الذين ادخلهما المستخدم في بداية البرنامج .::
كود PHP:
[right]myclass ob2(n,m);
ob2.display();
[/
right]

ليتم بعدها طباعة العددين m,n من خلال دالة الطباعة display()
** متى تستدعى دوال البناء والهدم ؟!

1- يعتمد الترتيب الذي يستدعى به هذه الدوال على ترتيب الذي يدخل فيه التنفيذ أو يخرج من المجال الذي عرفت فيه الكائنات .
2- بشكل عام . يتم استدعاء دوال الهدم بترتيب
معاكس لدوال البناء غير أنه يمكن أن يتغير هذا الترتيب في بعض الحالات ( ستذكر في السياق )
3- تستدعى دوال البناء للكائنات المعرفة في
المجال العام وقبل تنفيذ أي دالة بما فيها الدالة Main() .
4- تستدعى دوال الهدم المقابلة عندما تنتهي الدالة
main().
5- تستدعى دوال البناء
للكائنات المحلية التلقائية عندما يصل التنفيذ إلى النقطه التي عرفت فيها الكائنات .
6- تستدعى دوال الهدم المقابلة عندما تغادر الكائنات المجال الذي عرفت فيه .
7- تستدعى دوال البناء للكائنات
المحلية الساكنة عندما يصل التنفيذ إلى النقطة التي عرّفت فيها الكائنات وتستدعى دوال الهدم المقابلة عند انتهاء الدالة Main() .

1.    ** برنامج يوضح لك النقاط السابقة حتى تتضح الرؤية حول كيفية الاستدعاء

كود
PHP:
#include <iostream.h>
#
include <cstdlib>
using namespace std ;
class createAndDestroy
{
private:
int data;
public:
createAndDestroy (int);
~
createAndDestroy();
};
createAndDestroy::createAndDestroy(int value)
{
data=value;
cout<<"object "<<data<<" Constructor \t";
}
createAndDestroy::~createAndDestroy()
{
cout<<"object"<<data<<"destructor"<<endl;
system("PAUSE");
}
void create();
createAndDestroy first(1);


int main()
{
cout<<"global object before main"<<endl;
createAndDestroy second(2);
cout<<"Local Automatic in main"<<endl;
static createAndDestroy third(3);
cout<<"Local Static in main"<<endl;
create();
createAndDestroy fourth(4);
cout<<"Local Aotumatic in main"<<endl;

system("PAUSE");
return 0;
}

void create()
{
createAndDestroy fifth(5);
cout<<"Local Aotumatic in Create \n";
static createAndDestroy sixth(6);
cout<<"Local Static in create \n";
createAndDestroy seventh(7);
cout<<"Local Automatic in Create \n";
system ("PAUSE");
}

وهذا هو شكل المخرجات :

ليست هناك تعليقات:

إرسال تعليق