الكثير يتسائل ماهي فائدة المراجع ؟؟
خلونا نبتدي بكود بسيط
#include <iostream>
#include <conio.h>
using namespace std;
int func(int x)
{
if (x >0)
cout << "You entered a positive number." << endl;
else if (x < 0)
cout << "You entered a negative number." << endl;
else
cout << "You entered a zero." << endl;
return x;
}
int main()
{
int response = 0;
cout << "Enter a number please: "; cin >> response;
func(response); //Passing value in function
getch();
return 0;
}اهني لما مررنا قيمة المتغيرresponse إلى الدالة func ، اخذنا نسخة من المتغير response (ركز كل تفكيرك على كلمة نسخة حتى تفهم المراجع في هذا الدرس البسيط)
تخيل انت قاعد تكتب ورقة ، رحت مكتبة و سويت ألف نسخة للورقة ، عشان تشتغل عليها و تعدل ، و خليت النسخة الأصلية محفوظة عندك. هكذا تعمل تمرير قيمة إلى دالة ، فأحنا لما مررنا قيمة response مررنا نسخة منه و ليس المتغير reponse بكبر راسه ، هذا يعني أن لما تنتهي الدالة func و نرجع إلى main ترجع قيمة response إلى صفر كما حددناها بالأول
و لكن ماذا لو أردت انت أن تممر قيمة إلى دالة و لكن تريد أن تمررها كلها برمة رأسها و إذا رجعت إلى main ترجع القيمة كما غيرتها في الدالة ؟؟
ألقي نظرة على هذا الكود :
#include <iostream>
#include <conio.h>
using namespace std;
void swapOne(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
void swapTwo(int& x, int& y) /*Notice that any value passed through x and y
means the WHOLE thing is passed, not just a copy of it */
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int myScore = 10;
int yourScore = 20;
cout << "Calling swapOne" << endl;
swapOne(myScore, yourScore);
cout << "myScore = " << myScore << endl;
cout << "yoruScore = " << yourScore << endl << endl;
cout << "Calling swapTwo" << endl;
swapTwo(myScore, yourScore);
cout << "myScore = " << myScore << endl;
cout << "yourScore = " << yourScore << endl << endl;
getch();
return 0;
}في الدالة مررنا قيمة myScore و yourScore بدون مراجع ، و بهالطريقة ، مررنا فقط نسخة من المتغيرات إلى الدالة ، لكن في الدالة القيمة تتبدل..... نعم لن تصدق ففي الدالة swapOne قيم المتغيرين تتبدال ، فتصبح قيمة myScore عشرون و قيمة yourScore عشرة ، و لكن عندنا تنتهي الدالة ، "تحترق النسخة" وو ترجع القيم إلى أماكنها ، لتأكيد هذا الكلام ، لما نرسل المتغيرين إلى الكائن cout بعدما أرسلناهم إلى الدالة swapOne نرى القيم نفس ما هي
اما الدالة swapTwo فتأخد المتغيرين بالمراجع ، اي تأخذ المرجع كله برمة راسه ، و تاخذه و تعالجه ، هنا في الدالة swpaTwo تتبادل القيم ، تماما كما حدث في الدالة swapOne بس احنا قلنا "تم تمرير المتغير برمة رأسه"
يعني لما يطلع المتغير من الداالة يأخذ تغيره معاه ، و لنأكد ذلك أرسلت المتغيرين إلى الكائن cout بعدما عالجتهم في الدالة swapTwo ، و راح تلاحظ ان القيم تبادلت اماكنها ;)
خلاصة الدرس : المراجع تستخدم لأخذ القيمة و تمريرها إلى دالة ليتم معالجتها و إخراجها إلى الدالة الرئيسية main بشكل ثاني تماما :) هذه العملية تسمى "تمرير عن طريق مرجع" Passing By Reference
بعكس إذا ادخلت قيمة إلى دالة بدون مرجع ، فسيتم اخذ نسخة من القيمة ، و هذه العملية تسمى تمرير بالقيمة Passing By Value
أتمنى استفدتوا من الدرس :)
تحياتي ،،،
فيرم