در این قسمت تیم کدگیت را با آموزش ارجاعها در سی پلاس پلاس همراهی کنید. در ابتدای آموزش، ارجاعها را معرفی کرده و یک مثال را پیاده سازی میکنیم. در ادامه ارسال ارجاعها در توابع را بررسی میکنیم. در آخر مثالی در مورد ارسال ارجاع در توابع میزنیم. پیشنهاد میکنیم قبل از مطالعه این آموزش، آموزشهای ابتدایی سی پلاس پلاس را مطالعه کنید.
ارجاعها در سی پلاس پلاس
ارجاع یا reference اصطلاحا نامی جایگزین برای متغیرهاست. وقتی یک متغیر را تعریف کرده و مقدار دهی میکنیم یک نام برای دسترسی به آن متغیر نسبت میدهیم. به عنوان مثال int a =10; در این جا a نامی است برای متغیری از جنس int با مقدار 10. در سی پلاس پلاس برای دسترسی به یک متغیر نام جایگزین (Reference) نیز تعریف میشود. این بدان معناست علاوه بر نام متغیر، نام جایگزین آن نیز برای دسترسی یا تغییر متغیر استفاده میشود. ارجاعها به صورت زیر تعریف میشوند:
int i = 17;
int& r = i;
همانطور که در قسمت بالا میبینید علامت & برای تعریف ارجاعها استفاده میشود.
برای درک بهتر ارجاعها مثالی را پیاده سازی میکنیم. در این مثال متغیری را تعریف کرده و ارجاعی به آن دادهایم. سپس با استفاده از نام متغیر و ارجاع آن به مقدار آن دسترسی پیدا کرده و آنها را چاپ میکنیم. کد این مثال به صورت زیر است:
// declare simple variables
int i;
double d;
// declare reference variables
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
در کد بالا متغیر i و d را تعریف کرده و ارجاعهای r و s نیز به آنها داده شده است. سپس با استفاده از نام اصلی متغیرها مقداری به هر کدام داده و آنها را با استفاده از ارجاعها چاپ کردیم. خروجی کد بالا به صورت زیر است:
Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7
ارسال ارجاعها به توابع
یکی از کاربردهای ارجاعها در سی پلاس پلاس ارسال آنها به توابع است. وقتی یک متغیر را به عنوان ورودی در توابع ارسال میشود در واقع یک کپی از آن بوده اما با ارجاعها، اصل متغیر ارسال شده و هر تغییر در آن روی کل برنامهتاثیر دارد. در مثال زیر دو متغیر را در متد Main تعریف کرده و در متد Swap مقدار آنها را جابجا کردیم. کد این مثال به صورت زیر است:
// function definition to swap the values.
void swap(int& x, int& y) {
int temp;
temp = x; /* save the value at address x */
x = y; /* put y into x */
y = temp; /* put x into y */
return;
}
int main() {
// Passing parameters by references
cout << "---------- Passing parameters by references ----------" << endl;
// local variable declaration:
int a = 100;
int b = 200;
cout << "Before swap, value of a :" << a << endl;
cout << "Before swap, value of b :" << b << endl;
/* calling a function to swap the values.*/
swap(a, b);
cout << "After swap, value of a :" << a << endl;
cout << "After swap, value of b :" << b << endl;
return 0;
}
همانطور که در کد بالا میبینید دو متغیر قبل و بعد از صدا زدن تابع swap، را چاپ کردیم. با استفاده از ارجاعها با تغییر در متد swap تغییرات در متد main نیز اعمال شد. خروجی کد بالا به صورت زیر میباشد:
Before swap, value of a :100
Before swap, value of b :200
After swap, value of a :200
After swap, value of b :100
تفاوت اشارهگرها و ارجاعها در سی پلاس پلاس
در آموزشهای گذشته اشاره به اشارهگرها کردیم و در این جلسه نیز به آموزش ارجاعها پرداختیم. حال با توجه به آشنایی با اشارهگرها و ارجاعها، تفاوت آنها را بیان میکنیم. این دو تقریبا شبیه به هم هستند و فقط در موارد جزئی با یکدیگر تفاوت دارند:
- نحوه ایجاد یکی با علامت * و دیگری با علامت & میباشد.
- برای تغییر مقدار متغیر با اشارهگر باید از علامت * استفاده کنید.
- اشارهگرها میتوانند خالی (Null) باشند اما ارجاعها حتما باید مقدار دهی شوند.
- ارجاعها قدرت کمتری نسبت به اشارهگرها دارند.