عرض مشاركة واحدة
قديم 03-05-2009, 11:03 PM   رقم المشاركة : 1 (permalink)
معلومات العضو
GoLdeN-z3r0
 
الصورة الرمزية GoLdeN-z3r0
 

 

 
إحصائية العضو






GoLdeN-z3r0 غير متواجد حالياً

 

 

إحصائية الترشيح

عدد النقاط : 10
GoLdeN-z3r0 is on a distinguished road

افتراضي 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





2 - hgfhkd Constructor , hgih]l Destructor

   

رد مع اقتباس