أما بخصوص الدوال_اثني تقبل أو تعيد متغيرات؛ فهي تتعامل مع الكائنات .. ولكن كيف؟
تمرير كائن كمتغير في دالة:
عداهد) أو بالمرجع (©666600؛ )؛ في المثال التالي يقوم البرنامج المكتوب بتعريف فئة ثم القيام بإستخدام دوال
((كدرة لام 56
اتحتوي الفئة »و على متغير محلي هو عبارة عن سلسلة نصية (مصفوفة محارف ونعتوععراء ثه بره )+
وعلى ثلاثة دوال_ تقوم الدالة (]98 بقبول سلسلة نصية وخزنها (بنسخها) في المتغير المحلي. كما تقوم الدالة ()104:م
بطباعة محتوى السلسلة النصية. تقوم الدالة ()00688» بدمج محتوى تلك السلسلة النصية لهذه الفئة(الكائن
بالطبع) مع سلسلة نصية مشابهة لكائن من نفس نوع الفئة(اي انه يشترط ان يحتوي على سلسلة بنفس الاسم والنوع).
الدالة الرئيس ()80م يتم إسناد سلسلة نصية للكائن 1و عبر الدالة (]968 ؛ ونفس العملية بالنسبة للكائن
2ه ثم يتم في السطر الرابع إستخدام الدالة العضو في الكائن 1 لتنفيذ عملية دمج السلسلتين في الكائنين. ومن ثم في
السطر الخامس طباعة محتوى السلسلة في الكاذن 1. بعد الدمج.
نة البرنامج السابق هي (11300 10 2118ط).
ولكن ما الذي سينتج؟ .. إذا تم إستبدال الكائن 2و بالكائن 1و في السطرين الرابع والخامس كالتالي:
ملاحظة : لا توجد علاقة بين الكائن 2 المعرف في أول سطر بالدالة الرئيس (]0810؛ والكائن بنفس الاسم
الممرر في تعريف الدالة (88352] 0000658 014؛ حتى لو تم إستخدام نفس المحارف للتسمية؛ إذ أن الكائن في تصريح
تلك الدالة هو مجرد كائن وهمي يستخدم (كما هو الحال في الدوال ) لتوضيح الإجراءات المستخدمة في حال تم تمرير
كائن من النوع 8؛ وذلك دون ان يتم إعتباره كائنا فعليا؛ بينما الكائن 2و المستخدم في الدالة الرئيس هو كائن حقيقي
من النوع 888
بالتأكيد كما في التركيب نستطيع إنشاء مصفوفة كائئات؛ مستخدمين نفس طريقة بناء الجملة في
التصريح عن مصفوفة أعداد صحيحية أو حقيقية(02:5 :0 35©ع1088)؛ سوف يقوم البرنامج التالي بتعريف
دالة عادية تقبل مصفوفة كائنت ممره إليه:
عامصي فعواء
اعتدنام
.0 متاعصنة بعطاء دعصف /زم* عامضهة إسعطاء أعتول
الباني والهادم (065070640:5 :8 60055061015)
أقبل الدخول في تفاصيل الباني والهادم دعونا تتذكر الطرق المختلفة للتصريح عن متغير عادي. تابع لأحدالأنواع
مثلا المتغير « يحمل قيم مختلفة حسب المترجم 1188م0ه» المستخدم؛ إذا يمكن ان تكون صفرا أو أقل قيم النوع
الصحيح 1018_1807 وهذه القيمة أيضا تعتمد على الحيز الذي تحتله الاعداد الصحيحة في الذاكرة حسب المترجم ونظام
التشغيل المستخدم.
طريقتين إما بعد التصريح عنه :
أو بنفس عبارة التصريح بأحد طريقتين إما:
أو بطريقة مكافئة :
إن فكرة الباني هي فكرة مشابهة لما سبق إلا ان خصوصية الفئات تتطلب مفاهيما أعقد من ذلك بكثير.
دعونا نتأمل هذا البرنامج البسيط:
(1044] لاقيام عتولا
يجوز
عشر عضو بياناه كلها صحيحة (عدد صحيح ومصفوفة من عشرة اعداد)؛ ويتكون كذلك من مجموعة من الأعضاء
-1018 : يقدم قيمة إبتدائية لعضو البيانات : ما تصطلح عليه التسمية بالإطلاق متم ه2نا عنصأ
- 08108 : طباعة عناصر المصفوفة (عضو البيانات في الفئة 2)6ج9)؛ حسب العناصر المدخلة.
إن من المستحسن دائما إعطاء قيمة إبتدائية للعناصر الأعضاء (0060056:35 4285) بمجرد تعريف الكائن
الأن القيم الابتدائية تساعد على استقرار المتغير المحجوز في الذاكرة وسهولة التعامل معه؛ هناك دالة عضوةة
تقدمها (++ح). تقوم بعمل إطلاق (118181128100) يم إبتدا ضاء بيانات في الفئة؛ وذلك بإستدعائها بعد التصريح
عن الكائن في الدالة الرئيسية, هكذا:
إن الدالة :(!:01 تقوم بدور الدالة الباني كما سيأتي؛ مع فارق بسيط هو أننا - في حالة الباني - لن نحتاج بعد ذاك
إلى إستدعاء دالة إضافية في الفئة .. إذا يتم تنفيذ الدالة العضوة (دالة الباني ) بمجرد تعريف الكئن .. فالسطرين
السابقين في البرنامج اعلاه؛ سوف يتم إختصارهما بسطر واحد هو:
وكي نستفيد من هذه الفكرة في تعديل البرنامج السابق .. نحتاج إلى تعريف دالة باني في جسم الفئة بنفس محتوى
الدالة (إغتصاء
التصريح عن الباني وتعريقة 0666:5ة005 46110108 2116 2:1115اى؛
يتم تعريف الباني عن طريق دالة عضوة (60068060 00601563) ضمن الفئة الاصلية بنفس إسمها كالمثال التالي :
في المثال السابق يتم إستبدال الدالة العضوة ()18م: بالدالة العضوة أعلاه؛ إن هذه الدالة . (|ءاءهعه لا تحتاج إلى
إستدعاء لأنها تنفذ بشكل طبيعي بمجرد تعريف كائن وحجز موقع له في الذاكرة؛ وبطبيعة الحال عند تعريف كائن آخر من
نفس الفئة؛ يتم تنفيذ الدالة العضوة الخاصة به وإطلاق محتواها.
الدالة السابقة في المثال؛ تنفذ بمجرد تنفيذ السطر :
؛ الذي يسهل عملية التعامل مع الذاكرة؛ كما هو
تكمن أهمية الباني 005806083 في عملية الإطلاق التلقاك
الحال مع أهمية إطلاق قيم إبتدائية للمتغيرات القياسيةٌ فالجملة التالية:
أفضل بكثير كم ذكرنا سابقا - من المقطع البرمجي التالي:
ومن ناحية أخرى فإن مبداً التغليف الذي يساعد على حماية محتويات الفئة يشجع على إستخدام الباني (وكذلك الهادم
كما سيأتي) من أجل _مأمونية التعامل مع البيانات الاعضاء الخاصة بالفئة .. ونذكر أن تطبيق_مبدا التغليف
01080501800© يعني :
.١ حماية أكثر للعناصر الأعضاء.
'.أخطاء أقل من قبل المبرمج نفسه؛ أو الفئات الآخري.
ولأن الباني هو دالة تنفذ بمجرد التتصريج: عي كائن؛ فإننا نكون مقيدين بشروط دالة الباني عند التصريح عن كائن
نلاحظ أننا نستطيع تعريف الباني خارج إطار تعريف الفئة بالطريقة التي تعلمناها سابقا وذلك بإستخدام المؤثر
«)_يتتبر الباني دالة خاصة عضوة في الفئة؛ تسمح لنا بإطلاق قيم إبتدائية عند التصريح عن
)يتم إستدعاء دالة الباني تلقائيا (آليا) بمجرد التصريح عن الكائن.
بشكل إجباري يتم تسمية الدالة الباني بنفس تسمية الفئة؛ واي دالة (عضوة في ة) تحمل إسم
4) لا تحمل دالة الباني أي مخرجات؛ ولا حتى من النوع 10من؛ كإصطلاح تعريف.
»)_الدالة الباني دائما تأخذ المدى عناطيم؛ ... (لماذا؟).
)رغم كون دالة الباني لا تحمل اي مخرجات .. إلا أنها تأخذ اي نوع من المدخلات .. سواء
مدخلات صفرية (010015ع:28:0-2) أو مدخلات متعددة (مدخل واحد أو أكثر ) 22201216101260
5)_كذلك وكأي دالة أخرى .. يمكن لنا جعل دالة البائي متعددة الأسماء (01/6:1630:0).
اترتيب تنفيذ دالة الباني ((816 101/662 00517106401 )0 :10:02
في وقت التصريح عن كائن يتم في البداية حجز موقع في الذاكرة للكائن نفسه؛ ومن ثم يبدا إستدعاء دالة الباني؛
ويتم التصريح عن دوال الباني للكائنات العامة ( م50 5251عهاج)أولا؛ وذلك حسب ترتيب التصريح عنهاء البرنامج
التالي يبين بعض هذه التفاصيل:
(تتغصإعام ضع
المسطلح 2860-200008015 يعني عدم وجود مدخلات للدالة.
((1) 1ه عام 0ه
((4 4 عام 0ه
أما عملية الهدم .465200668 (تنفيذ دالة الهادم) تتم بطريقة معاكسة لعملية البناء؛ اي يتم البدء من الكائنات
المحلية ثم العامة (سنأني لمفهوم الهادم لاحقا).
أنواع دوال الباني :6005:0660 7ه 5/028 :
الباني التلقائي (+:005200640» انج)هل) : عندما لا انقوم بتعريف دالة باني لفئة ما؛ مالذي يحصل عند
التصريح عن كائن من نوع تلك الفئة؟؛ كما حصل معنا البرامج السابقة.
إن المترجم يقوم بنفسه من تعريف دالة باني (بدون أي محتوى). تقوم هذه الدالة بالعمل فور التصريح عن
ولكن عند تعريف أي دالة باني بواسطة المبرمج فإن إن المترجم لا ينشى دالة الباني التلقائية. سواء كانت دالة
الباني الخاصة بالمستخدم تحتوي على مدخلات ا صفرية (0108805ع:0-2م26) أو متعددة المدخلات
(0212101600012©0-2060016015). أو احتى عند إنشاء اكثر من دالة باني بطريقة تعدد الاسماء
(006:1080108)' كما سيأتي .
الباني متعدد المدخلات 02120861260 :
الثاني (الطالب الثاني) يبدا تصريحه بقيمتين إبتدائيتن هم درجته في مادة مثلا و قيمة مصروفه اليومي
وكان الطالب الثالث لا يحتاج إلى اي قيم إبتدائية.
إننا في هذه الحالة نحت إلى اكثر من دالة باني تحتمل كل واحدة عدد
من المدخلات حسب الكائن
عاوضه: فعواء
اتسنا
الدسا
ترجمة المصطلح ع8:162010/ا0 حرفيا إلى التحميل الزائ. ولكن المفهوم لا يحتمل هذه الترجمة الحرفية, إذا أن الترجمة المناسية للمفهوم
هو إعادة التسمية (أو تحدد الأسماء) كنوع من أنوع تعدد الاشكل و10و1م10003ر0ام. كما مني إليه لاحقاء
لاحظ عملية تعريف الكائنين 1,92 بطريقتين مختلفتين .. حسب دالة الباني التي يتم إستدعائها؛ يسمى
الباني هنا بالباني متعدد الاسماء (م40ع600580. 0 حيث يحمل اكثر من تعريف بنفس الاسم
والفارق هنا (كما هو معروف في الدوال من هذا النوع) هو عدد المتغيرات للتمييز بين الباني والآخر عند
الطنجني ادس
الفائدة الأخرى من إستخدام الباني متعدد الاسماء ( +:0058000640. وجوج هو تحاشي إطلاق
إلى إطلاقها في الوقت الحالي .. عند التصريح عن الكائن
دالة باني من النوع متعدد المدخلات. فلا يحق لنا عندئذ التصريح عن الكائن بالطريقة
التقليدية (:1ه »ام:80م) إذ ان تمرير المتغيرات أصبح (في هذه الحالة) غير إختياري.
في هذه الحالة ولتجنب الوقوع في الخطأً نقوم بتعريف هادمين بطريقة تعدد الاسماء ن061/:16808
+00500610؛ يكون أحدهما بدون مدخلات 26+0-2780108045؛ وذلك لتحاشي هذه المشكلة المتوقعة ..
التصريح عن كائن يطلق دالة باني بمتغير/مدخل واحد .. كحالة محددة.
النسخ :600500640 لا0ر60 :
ضَِ أننا أردنا التصريح عن كائن وبعد مجموعة من العمليات عليه قمنا بنسخ محتوياته (آخر قيم
سوف نستخدم الجملة:
ولكننا نعلم أن الجملة الأخيرة (:2-0[1ر0 ©م/018558) هي عبارة عن إطلاق باني مفترض للفئة
مهاه تقوم دالة هذا الباني بإستقبال مدخل واحد من نوع الفئة نفسه؛ ونسخ محتوياته إلى الكائن
2ه الذي اطلق هذه الدالة
ولكن عند تطبيق مثال على البرنامج أعلاه نجد اننا لسنا بحاجة إلى كتابة دالة باني تقوم بهذه العملية؛ إنها
دالة باني هامة يسمى باني النسخ(:0005400680 لام0)؛ يقوم مترجم لغة ++ بتنفيذها تلقائيا. دون أن
الفائدة الأخرى من دالة باني النسخ هي عملية تمرير كائن إلى دالة (أخرى .. سواء كانت عضوة في فئة أو
لا)؛ خاصة إذا كان التمرير بطريقة التمرير بالقيمة (عنادل لاا 855106م)؛ إن التمرير بالقيمة كما نعلم
يقوم بأخذ نسخة من المتغير الممر ؛ وإجراء العمليات عليه .. في حالة كان المتغير الممر هو كائن ..فإن
دالة باني النسخ تقوم بعملها تلقانيا. دون أن يصدع المبرمج دماغه بكتابتها.
و كذلك عملية إرجاع القيمة من دالة .. (6ن001/31ن86] .. تمر بنفس عمليات النسخ سابقة الذكر.
السؤال الآن :
'تمرين: قم بكتابة فة لنوع طالب. تحتوي على عناصر أعضاء (كالعمر والدرجة مثلا)؛ وتحتوي على دالة
باني واحدة تقوم بدور دالة باني النسخ وذلك بنسخ محتويت الكائن الحالي إلى كان جديد.
مساعدا
الكائن الممرر لدالة باني النسخ يجب ان يكون بطريقة التمرير بالمرجع (ع27606)ع؟ برط 0859105) ٠
وذلك لأن تمرير الكائن بطريقة التمرير بالقيمة .. يعني .. عمل نسخة من ذلك الكائن .. النسخة نفسها سوف
تستدعي دالة البائي التلقائي .. مما يعني عدم إتخدام يم الكائن الممر التي نريد نسخها أصلا.
هي دوال باني عادية .. لكنها تستخدم عناصر أعضاء من النوع المؤشر (010482م)؛ في هذه الحالة تقوم
بعملية التعريف الديناميكي للمؤشر عند التصريح عن الكائن .. ويتم ذاك بإستخدام المؤثر الخاص بلغة جب
نعلم جميعنا ان المتغيرات العادية (الاستاتيكية) يتم حجز موقعها في الذاكرة طوال عمل البرنامج. ولا يتم
غالبا التخلص من هذا الحيز إلا عند إنهاء البرنامج.
إن المؤثر (ب«»») - الذي لم يكن موجودا في لغة ©؛ يقوم بعملية حجز موقع ديناميكي للمتغير .. يكون قابلا
للإلغاء عن طريق المؤثر المقابل 46168 بالشكل:
التصريح عن المتغير الصحيح وحجز موقع ديناميكي له في الذاكرة// ييز عه - بر
إلغاء موقع المتغير من الذاكرة // م4616
في المثال التالي نعرف مؤشر يؤشر إلى بداية مصفوفة بطريكة عادية مرة ؛ وبطريقة ديناميكيةٌ مرة أخرى
الأعضاء في الذاكرة.
لا8ا١ة قفا
ملام
لاق عط آه تمعصعاء ع عدا عصنصمعخعل | | :