اقتباسمتى نرسل الكائن أو نرجعه من أحد الدوال by reference أو by value ؟
هذا السؤال يواجهنا عندما ننتهي من دراسة الكائنات و Operators Overloading و الـ Friend Functions ,,,, المهم هي مفاهيم بسيطة نستفيد منها في البرمجة الكائنية بشكل كبير !
بالنسبة لإرسال الكائن بالقيمة by value فهذا يكون من دالة داخل كائن member function أو خارجها و مثال على ذلك هو لو كان لدينا مصفوفة و أردنا البحث عن كائن فيها فيتم ارجاع الكائن by value ,,
بالنسبة للإعادة by reference فيمكن أن يصلح المثال الذي في الأعلى كما في STL Vector و غيرها من الـ Containers و هي بكل بساطة عن أوعية لحفظ البيانات ,,
و لكنها اشتهرت في عملية الـ Operators Overloading لأنها تمكننا من انجاز شيء قد يبدو صعباُ في البداية و لكنه من أمتع أنواع البرمجة,, لأنه يمكننا من استعمال الـ Operators مع الفئات لإنجاز أشياء لم تخطر في البال !!!!
هل جربت استخدام string في ++C ؟
string str1, str2, str3; str1 = "Operators OverLoading"; str3 = str2 = str1; // = all of them = "Operators OverLoading"
لو لاحظت العملية التي ساوينا فيها str1 عملية إعادة تعريف = Operator لا غير و لو قمنا بكتابة الكود لكان داخل الكائن كالتالي :
void operator =( string &NewStr );
مع ملاحظة أن المعامل يعيد void أي أنه لا يعيد شيء!!!
و لو أننا أردنا معرفة بعض المعلومات التقنية عن معنى void فهي بكل بساطة ان الشيء المعاد من الدالة ليس معرفاً,, بدينا نتكلم في الرياضيات :D
هي بكل بساطة الدالة لما تدخل إلى المعالج يتم إعادة القيمة في مكان في المعالج ( يسمى Register ) و ليس في الذاكرة و بالتالي إذا كانت الدالة تعيد شيء فيجب أخذ القيمة أما إن كانت لا تعيد شيء فلا معنى من أخذ القيمة من ذلك المكان..
و الآن لننظر إلى عملية المساواة الثانية ,, بالطبع تعرف أن عملية المساواة ستتم بين str1 و str2 أولاُ حسب عملية الترجمة لأنها عبارة عن عبارة expression و ناتج العبارة على اليسار يساوي ناتج العبارة على اليمين ,
لو أننا أعدنا void من عملية المساواة بين str1 و str2 لكان لا معنى لمساواة str3 بها لأننا كأننا نساويها بـ void و لكن في كائن الـ string ما يسمى بالـ Operators Chaining أو كإمكانية عمل سلسة من عملية المساواة كما في المثال الذي في الأعلى,,
و لكن عندما نرجع الكائن نفسه by ref فإننا أوجدنا ميزة التسلسل في الكائن ,,
أخيراُ ,,
يمكن تنفيذ عملية التسلسل بطريقتين أعرفهما ,, الأولى أن يتم التعريف داخل الكائن نفسه أو أن يتم التعريف كـ friend ,,
في كلتا الحالتين سينك تنفيذ ما نريد بطريقتين مختلفتين و على كل حال لن أدخل في تفاصيل الفروق حتى لا يطول الكلام ,,
فلو نظرنا إلى عملية المساواة الثانية يمكن تخيلها على الشكل التالي مع التسلسل :
str2 = str1 ثم أعاد str2 نفسه ثم تمت عملية المساواة الثانية str3 = str2
مثال عن معامل معرف من داخل كائن :
string& operator =( string &NewStr );
و عند كتابة الدالة يمكن أن يعيد الكائن نفسه عن طريق الموشر this المحجوز للتأشير على الكائن الذي نكتب كوده!
return *this;
أما إن كنا نستخدم friend Operator فالتالي هو المطلوب :
friend string& operator =( string &OldwStr, string &NewStr );
و يتم إعادة OldStr by ref
return &OldStr;
تحياتي ,,



