ممكن أعرف الفرق بين تمرير الدوال بواسطة القيمة value وتمريرها بواسطة المرجع reference
ويكون أفضل بمثال.
ممكن أعرف الفرق بين تمرير الدوال بواسطة القيمة value وتمريرها بواسطة المرجع reference
ويكون أفضل بمثال.
تم تعديل هذه المشاركة بواسطة pink ghost في 2 ديسمبر 2009 في 20:46
هذا يعتمد على ماتود عمله . ولكنني افضل call by reference لانها الاقل في استهلاك الذاكره.
ولكن في احيان كثيرة لايمكن ان تستخدم فيها Call by reference ولابد من استخدام call by value
أما الفرق بينهما فهو ان by value هي ارسال قيمة المتغيير الى الفنكشن بدون ان يتأثر المتغير الاصلي . اما by refence فهي ترسل عنوان المتغيير وأي تغيير يطرأ . يكون على المتغير الاصلي مباشرة .
علماً بأنني طالب في المادة ولا اجيدها فقط حسب قراءاتي . وانتظر رأي الخبراء فيها .
تحياتي
تم تعديل هذه المشاركة بواسطة omani في 2 ديسمبر 2009 في 20:49
OMANI FOR EVER
-------------------------------------------------

-------------------------------------------------
طريقة استدعاء التابع بالقيمة تستخدم بأغلب الأحيان لتمرير متغيرات فعلية الى التابع حيث يتم انشاء نسخة من المتغيرات الفعلية في المتغيرات الشكلية للتابع بالتالي عندما يحصل تغيير على هذه النسخة ضمن التابع الذي استدعيته لن يؤثر ذلك على قيم المتغيرات الفعلية و هذا يعني أننا لا نستيطع تبديل قيم المتغيرات التي استدعت التابع و استعمال هذه الطريقة لتمرير معطيات كبيرةتؤدي إلى زيادة زمن التنفيذ
طريقة استدعاء التابع بالمرجع تعني أن يعلن عن المتغير الشكلي بأنه مرجع للمتغير الغعلي أي أن المتغير و المرجع لهما نفس العنوان في الذاكرة و أي تغير في أحدهما يغير الأخر و بالتالي سيكون لهما نفس القيمة
و يتم ذلك بإلحاق نوع المتغير الشكلي ب & و بالتالي إعطاء التابع الذي يتم استدعائه أماكن الوصول المباشر إلى معطيات البرنامج المستدعي و تغييرها إن دعت الحاجة أي أنه بإمكاننا تغير قيمة هذا المتغير الفعلي خارج التابع المستدعي
مثال يوضح الفرق بين الاستدعاء بالقيمة و بالمرجع
#include<iostream.h>
void f(int x,int &y)
{
x=88;
y=99;
}
void main()
{
int a=22,b=33;
cout<<"local a in main before calling f is :"<<a<<endl;
cout<<"local b in main before calling f is :"<<b<<endl;
f(a,b);
cout<<"local a in main after calling f is :"<<a<<endl;
cout<<"local b in main after calling f is :"<<b<<endl;
}