Tutorial 7: pass by value VS pass by reference

السلام عليكم الجميع

اليوم راح نتكلم عن الفرق بين pass by value VS pass by reference وطبعآ راح احط مثال مع الدالة بحيث تسهل الفهم و توصل المعلومة بشكل صحيح ~

ايضآ تقدر تسوي الطريقه هذي داخل main فقط ولكن احتجت اسويه عن طريق الدالة افضل

pass by value

هو المرور القيمة نفسها الى مكان اخر. افرض عندي دالة وحده

داله راح تكون ادخل الاسم و العمر تمام. احنا عرفنا لما ندخل القيمة الاسم والعمر راح تروح على الدالة على طول و منها نسوي طباعه من داخل الدالة الاسماء.

هذا مثال:

passby1

احنا سوينا مرور القيمة الى داخل الداله تمام. وطبعآ هذا يعتبر pass by value ليه؟

لانه القيمة نفسها هي غير افتراضية و راح تكون نفسها يعني لو في دالة ثانيه و نبي نمرر القيمة راح ترفض العملية و نحتاج شي اسمه pass by reference لانه القيمة راح تعمل نسخه لنفسها الى الداله اخرى وهكذا.

فرضيآ: لو سوينا داله ثانيه تعرض لنا النتيجة من داله الاولى الى هي الاسم

بنسمي الداله display و نشوف ايش النتيجة تظهر لنا:

passby2

مثل ماتلاحظ النتيجة خطأ بسبب عدم المرور القيمة الى داله اخرى لانه اول مايرجع في function call  راح يوقف على طول يعني لو نبي نسخه ونكمل على الداله ثانيه راح يعطينا خطأ بالطباعه.

لانه القيمة نفسها هي غير افتراضية وماعملت لنفسها نسخة.

pass by reference

معناها القيمة نفسها راح تنسخ نفسها افتراضية كامرجع مع وجود نفس القيمة الى مكان اخر

يعني لو عندنا دالتين نقدر نعمل مرور لها الى داله الاخرى من غير مشاكل

افرض عملنا متغير و عطينا القيمة رقم 4 زي كذا

int a =4; 

نبي نمرر القيمة من الدالة اسمها

void names( );

الى داله اخرى اسمها

 void display( );

طبعآ راح تتمرر بشكل طبيعي بطريقة عمل نسخه افتراضيه لنفسها مع بقاء نفس القيمة و

القيمة رقم 4 يعني نسخة في الدالة الاسماء و نسخة في دالة الاظهار تمام.

طيب انا مابي اسوي طباعه من داخل الداله نفسها زي مثال الاول و افرض عندي اكثر من 4 دوال و كل واحد له شغله معينة مثل حاسبه او العمر او الاسم او اين كان

وابي اسوي داله الاخيره تكون تطبع النتايج الى كتبتها يعني تكون نتايج النهائية

خلينا نسمي الدالة الاخيره و تكون هكذا

display(name,age);
void display(string name, int age){

     cout<<"Your name is: "<<name<<endl;
     cout<<"Your Age is: "<<age<<endl;
 }

كل الى تحتاجه تسويه عشان القيمة تعمل نسخه افتراضية كامرجع نضع علامة & قبل المتغير

هذا مثال

 void names(string &name, int &age);

ليه؟ لانه نبي القيمة الاسم والعمر تعمل مرجع الى داله اخرى او الى بعدها

بحيث تظهر لك النتيجة بشكل سليم

هذا مثال بالصوره:

passbyref

مثل ماتلاحظون طلعت النتيجة بشكل سليم لانه عملنا تمرير القيمه نسخة افتراضيه من الدالة الاسماء من خلال function call الى الدالة الاظهار.

ولكن مع الملاحظة: ماتحتاج تضع علامة & في الدالة الاظهار بسبب احنا نبغى النتيجة فقط.

هي قد تكون شويه معقده بس يحتاج تكرار و ممارسه عليها لين ماتوصل المعلومة

طبعآ هذي غير عن pointer ولا تشبه لها ابدآ.

مفيدة في حال انك تبي تنقل القيمة نفسها الى مكان اخر من غير مشاكل

هذي صوره  مثال افضل واوضح الفرق بين by reference and by value

pass-by-reference-vs-pass-by-value-animation

تلاحظ معاي في by value راح تعمل نسخة نهائية من غير عمل نسخة اخرى ولكن

by reference راح تعمل نسخة افتراضية الى دالة اخرى او مكان اخر من غير مشاكل وايضآ مع بقاء نفس القيمة.

هنا انتهى الدرس

اذا احتجتو اي حاجة او مافهمتو شي خبروني واشرح لكم

اشوفكم على خير 🙂