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.
يحمل الهادم نفس اسم صنفه تماما مسبوقا بالمحرف (~) ويجب ألا يعيد أية قيمة وليس له نمط للنتيجة.
نستفيد من الهادم بشكل رئيسي إذا احتاج الكائن لحجز ذاكرة ديناميكة خلال فترة حياته، إذ يجب علينا في اللحظة التي ننهي بها حياة الكائن تحرير أية ذاكرة حجزها ديناميكيا خلال فترة حياته. مثال: