:: vBspiders Professional Network ::

:: vBspiders Professional Network :: (http://www.vbspiders.com/vb/index.php)
-   قسم البرمجة الكائنية (http://www.vbspiders.com/vb/f174.html)
-   -   2 - الباني Constructor و الهادم Destructor (http://www.vbspiders.com/vb/t5709.html)

GoLdeN-z3r0 03-05-2009 11:03 PM

2 - الباني Constructor و الهادم Destructor
 
الباني Constructor و الهادم Destructor

تحتاج المتحولات عادة لتهيئة قيم متحولاتها (حقولها) أو حجز مساحة ديناميكية من الذاكرة لبعض المؤشرات خلال عملية إنشاء الكائن وذلك ليصبح الكائن جاهزا للعمل ولا يتسبب بحدوث أي نوع من الاخطاء غير المتوقعة أثناء التنفيذ. فمثلا ما هي القيمة التي سنحصل عليها لو أننا في المثال السابق استدعينا المنهج ()area قبل استعداء المنهج ()set_values سنحصل ربما على نتائج غير محددة إذ لم نسند أي قيمة بعد للمتحولين xوy.
تقدم لنا الأصناف حلا لهذه المشكلة من خلال نوع خاص من المناهج يسمى الباني Constructor، وهو منهج خاص من مناهج الصنف يحمل نفس اسم الصنف تماما (بما في ذلك حالة الأحرف الصغيرة والكبيرة)، حيث يٌستدعى هذا المنهج الخاص آليا لدى إنشاء أي كائن من الصنف صاحب المنهج الخاص (سواء تم التصريح عن الكائن أو تم حجز كائن من هذا الصنف في الذاكرة عن طريق العامل new). لنعيد تعريف الصنف CRectangle من جديد مع بان له:
// classes example
#include <iostream.h>

class CRectangle {
int width, height;
public:
CRectangle (int, int);
int area (void) {return (width*height);}
};
CRectangle::CRectangle (int a, int b) {
width=a;
height=b;
}

int main() {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout<<"rect area:"<<rect.area()<<endl;
cout<<"rectb area:"<<rectb.area()<<endl;
}

Output:

rect area:12
rectb area:30

لاحظ تطابق نتيجة تنفيذ هذا البرنامج مع البرنامج السابق، فلقد استبدلنا استدعاء المنهج ()set_values (الذي لم يعد موجودا) بباني الصنف. ولاحظ أن مكان تمرير وسطاء الباني يكون في مكان إنشاء الكائن من الصنف المعني:
كود:
CRectangle rect (3,4);
CRectangle rectb (5,6);

ويجب أن تلاحظ ايضا عدم وجود قيمة معادة من الباني لا في ترويسته ولا في التصريح عنه(كتابة تعليماته) ولا حتى النمط void. وهذا شكل إجباري للباني، إذ لا يعيد الباني أية قيمة، كما لا نستطيع تحديد نمط الباني بأنه void تماما كما فعلنا في المثال السابق.

لننتقل الآن إلى الهادم Destructor الذي يقوم بعمل معاكس للباني، حيث يُستدعي آليا لدى الحاجة لتحرير كائن من الذاكرة، الأمر الذي يحدث سواء بسبب إنتهاء مجال رؤية الكائن (بعد انتهاء التابع الذي نصرح فيه عن مكان كائن محلي) أو بسبب تحرير الكائن المحجوز في الذاكرة الديناميكية باستخدام العامل delete.
يحمل الهادم نفس اسم صنفه تماما مسبوقا بالمحرف (~) ويجب ألا يعيد أية قيمة وليس له نمط للنتيجة.
نستفيد من الهادم بشكل رئيسي إذا احتاج الكائن لحجز ذاكرة ديناميكة خلال فترة حياته، إذ يجب علينا في اللحظة التي ننهي بها حياة الكائن تحرير أية ذاكرة حجزها ديناميكيا خلال فترة حياته. مثال:

// example on constructors and destructors
#include <iostream.h>

class CRectangle {
int *width, *height;
public:
CRectangle (int, int);
~CRectangle ();
int area (void) {retrun(*width * *height);}
};

CRectangle::CRectangle (int a, int b) {
width=new int;
height=new int;
*width=a;
*height=b;
}

CRectangle::~CRectangle() {
delete width;
delete height;
}

int main() {
CRectangle rect (3,4), rectb (5,6);
cout<<"rect area:"<<rect.area()<<endl;
cout<<"rectb area:" <<rectb.area()<<endl;
return 0;
}

Output:

rect area: 12
rectb area:30



El3ctr0-Dz 03-05-2009 11:58 PM

يا سلاااااااااام
و الله مبدع
بارك الله فيك

ابو بدر 03-06-2009 08:08 AM

مشكوووووووووووووووووووور مبدع اخي الكريم

●๋•ஜ ⋋MATRX H@!L⋌ ஜ●๋• 03-06-2009 05:16 PM

مشكوور يا بطــــل

ابو بدر 06-14-2009 05:42 AM

مشكوووووووووور اخوي والله يعطيك العافية

data$hack 06-27-2009 12:47 PM

شكري لك يالغالي وواصل ابداعك

المفترس 07-20-2011 08:58 PM

مشكوووووووووووووووووووور اخي

مہہسہہتر قہہروشہہة 08-04-2011 09:34 PM

يعطيك العافيه


الساعة الآن 11:41 AM


[ vBspiders.Com Network ]


SEO by vBSEO 3.6.0