الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

عاوز شرح بسيط وسهل لموضوع pass by refrence

بدأه مستر برمجة في 21 أغسطس 2011 · 4 رد · 7,322 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

إخوانى الاعزاء لدى أستفسار ممكن يكون فعلا بسيط جدا بالنسبة لناس , لكن بالنسبة لى حاولت أن أفهمة لكن لا يريد أن يدخل دماغى .

الموضوع ما هو pass-by-refrence فى الـ C++

void swap (int &a, int &b)

ما الفائدة من أستخدامها ؟

وما الفرق بينة وبين pass-by-value ؟

أرجو وضع مثال بسيط بيبن الفرق بين pass-by-refrence و pass-by-value

أرجو منكم إخوانى شرح بسيط وسهل لانى تابعت كذا شرح لكن للاسف مش فاهم حتى الان .

تم تعديل هذه المشاركة بواسطة حبيب الله في 21 أغسطس 2011 في 10:59

||||||||||||||||||||||||||||||||||||


||||||||||||||||||||||||||||||||||||


egypt_coa.gif


||||||||||||||||||||||||||||||||||||


||||||||||||||||||||||||||||||||||||

#2

وعليكم السلام،

بالمثال:

#include <iostream>
using namespace std;

void PassByValue(int value)
{
	value += 10; //add value by 10
	cout<<"\nvalue = "<<value<<" inside PassByValue";
}

void PassByReference(int& value)
{
	value += 10;
	cout<<"\nvalue = "<<value<<" inside PassByReference";
}

int main()
{
	int value = 10;

	cout<<"\nvalue = "<< value <<" before PassByValue";
	PassByValue(value);
	cout<<"\nvalue = "<< value <<" after PassByValue";

	cout<<"\n\nvalue = "<< value <<" before PassByReference";
	PassByReference(value);
	cout<<"\nvalue = "<< value <<" after PassByReference\n";


	return 0;
}

وفقط انظر بالناتج،

post-247423-097850700 1313936083_thumb.p

والسلام عليكم :-)

المرفقات
Passing.png

..:: رَبِّ زِدْني عِلْمًا ::..

#3

بسم الله الرحمن الرحيم

أولا pass by value :

مثال

#include <iostream>
using namespace std;
int fan(int x)
{
x= 10;
return x;
}
void main()
{
int y=2;
cout << "before fan works : " << y << endl ;
cout << "inside fan : " << fan(y) << endl;
cout << "after fan works : " << y << endl;
}

تعال نشرح الان

يبدأ البرنامج من الدالة main() و نقوم بالإعلان عن متغير ونعطي له قيمه إبتدائيه وهي 2

نقوم بإخراج قيمة المتغير y والتي تكون 2.

الأن نقوم بإستدعاء الدالة fan ونمرر لها الوسيط argument

تقوم الدالة fan بالكشف عن طريقة تمرير هذا الوسيط

عند إعطاء التعريف للداله fan تخبر المترجم أن المعامل parameter "x" يمرر بواسطه القيمه passing by value لأنه ليس قيل إسمه أي علامات مثل (*أو &)

ولكن ماذا يعني التمرير بالقيمه تعني ان عندما تقوم انت بإستدعاء الدالة fan في ال main () وتمرر الوسيط y لها يقوم المترجم بنسخ قيمة y والتي هي 2 ويمررها للداله

وبالتالي لا تستطيع الدالة fan الوصول إلي المتغير y الحقيقي الذي مرر إلي الداله لأنه في الحقيقة لم يمرر بل النسخه منه (من قيمته ) هي التي مررت ومن هنا جائت

التسميه التمرير بواسطة القيمه

لاحظ معي أخي وركز علي هذه النقاط :

عند التمرير بواسطة القيمه يحدث الأتي الوسائط argument (والتي في المثال في السطر 12 "وهي y " ) لا تمرر إلي الداله (fan) مباشرة ولكن المترجم يقوم بعمل نسخ من هذه الوسائط

وتمرر هذه النسخ إلي الداله وبالتالي :

1.الداله لا تستطيع الوصول إلي y أو التعامل معه هي فقط تتعامل مع نسخه من قيمته

2. الدله لا تستطيع أن تعدل قيمة y الفعليه

شغل الكود بنفسك وتأكد .

post-245763-059533200 1313939142_thumb.p

ثانيا :pass by reference :

#include <iostream>
using namespace std;
int fan(int &x)
{
x= 10;
return x;
}
void main()
{
int y=2;
cout << "before fan works : " << y << endl ;
cout << "inside fan : " << fan(y) << endl;
cout << "after fan works : " << y << endl;
}

نفس الكود السابق ولكن فقط بدلنا المعامل parameter بالمعامل الجديد "x&".

وهنا يقوم المترجم بالكشف علي ان التمرير أصبح بالمرجع passing by reference .

ولكن ما هو التمرير بالمرجع عندما تقوم انت بإستدعاء الدالة fan في ال main () وتمرر الوسيط y لها يقوم المترجم بتمرير المتغير الفعلي y للداله fan

وبالتالي تستطيع الدالة fan الوصول للمتغير y الفعلي والتعديل في قيمته كما رأيت

post-245763-016215600 1313939040_thumb.p

خلاصة الفروق بين pass by value و pass by reference :(سنختصر بال value و refer):

1. يقوم value عند إستدعاء الدالة بتمرير نسخ الوسائط إلي الداله بينما refer يقوم بتمرير الوسائط الفعليه دون الحاجة إلي نسخ .

2.الvalue لا يمكّن الداله من التعديل في قيمة الوسيط الحقيقي علي عكس الrefer الذي قوم بذلك.

3.يعتبر refer هو أسرع أضمن في الأداء

أي سؤال اخر انا موجود

والسلام عليكم

ورمضان كريم

المرفقات
pass by reference.PNGpass by value.PNG
1

.............. بسم الله الرحمن الرحيم ...............ز

"فمن إتبع هداي فلا يضل ولا يشقي " صدق الله العظيم

ماض في الطريق إلي .... C++

#4

عند التمرير بالقيمه يتم نسخ القيمه الممرره إلى الداله و بالتالي التعديل علي القيمه الممرره لا يؤثر على القيمه الأصليه في شيء، مثال:

void change_me(int value)
{
   value = 15;
   cout << "value : " << value << endl;
}

int main()
{
   int x = 1024;

   cout << "x before : " << x << endl;

   change_me( x ); // copy value of x inside change_me

   cout << "x after : " << x << endl;
}

النتيجه بعد التنفيذ:

x before : 1024
value : 15
x after : 1024

التمرير بالمؤشر يتم نسخ عنوان الذاكره الخاص يالقيمه الممرره داخل الداله و بالتالي يمكن تغيير محتويات ذلك العنوان من داخل الداله و من خارجها، مثال:

void change_me(int* value)
{
   *value = 15;
   cout << "*value : " << *value << endl;
}

int main()
{
   int x = 1024;

   cout << "x before : " << x << endl;

   change_me( &x ); // explicitly copy addressof x inside change_me

   cout << "x after : " << x << endl;
}

كما تلاحظ داخل الداله change_me لابد من اجراء dereference ليتم التعديل على محتويات العنوان.

النتيجه بعد التنفيذ:

x before : 1024
*value : 15
x after : 15

التمرير بالمرجع يماثل التمرير بالمؤشر، الإختلاف بينهم هو ان التمرير بالمرجع لا تحتاج لتمرير عنوان او عمل dereference لأى شئ حيث يتم تمرير العنوان بشكل خفي و ايضا يتم عمل dereference بشكل خفي، مثال:

void change_me(int& value)
{
   value = 15;
   cout << "value : " << value << endl;
}

int main()
{
   int x = 1024;

   cout << "x before : " << x << endl;

   change_me( x ); // implicity copy addressof x inside change_me

   cout << "x after : " << x << endl;
}

النتيجه بعد التنفيذ:

x before : 1024
value : 15
x after : 15

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 21 أغسطس 2011 في 19:59

مدونتي: C++ Tips and Tricks

#5

الله يجازيكم الجنة أنتم وجميع المسلمين قولو أمين

أشكركم إخوانى جميعا (موليان, cpp _lover ,محمد علاء الدين ) على ردودكم الجميلة والتى هى فعلا سهلة الفهم

أنا الان الحمد لله فهمت أخيرا التمرير بواسطة المرجع والتمرير بواسطة القيمة , وسوف أكمل مسيرتى لتعلم الـ C++

وجزاكم الله كل خير جميعا على تعبكم معايا .

||||||||||||||||||||||||||||||||||||


||||||||||||||||||||||||||||||||||||


egypt_coa.gif


||||||||||||||||||||||||||||||||||||


||||||||||||||||||||||||||||||||||||

مواضيع مشابهة