ارسال آرگومان ها به روش ارجاع

آرگومانها را می توان به کمک ارجاع ارسال کرد. این بدان معناست که شما آدرس متغیری را ارسال می کنید نه مقدار آن را. ارسال با ارجاع زمانی مفید است که شما بخواهید یک آرگومان که دارای مقدار بزرگی است (مانند یک آبجکت) را ارسال کنید. در این حالت وقتی که آرگومان ارسال شده را در داخل متد اصلاح می کنیم مقدار اصلی آرگومان در خارج از متد هم تغییر می کند. در زیر دستورالعمل پایه ای تعریف پارامتر ها که در آنها به جای مقدار از آدرس استفاده شده است نشان داده شده است. برای ارسال یک متغیر با ارجاع کافیست که قبل از نام پارامتر یک علامت & قرار دهید :

returnType MethodName(datatype &param1)
{
   code to execute;
}

اجازه دهید که تفاوت بین ارسال با ارجاع و ارسال با مقدار آرگومان را با یک مثال توضیح دهیم :

   1: #include <iostream>
   2: using namespace std;
   3: 
   4: void ModifyNumberVal(int number)
   5: {
   6:     number += 10;
   7:     cout << "Value of number inside method is " << number << "." << endl;
   8: }
   9: 
  10: void ModifyNumberRef(int &number)
  11: {
  12:     number += 10;
  13:     cout << "Value of number inside method is " << number << "." << endl;
  14: }
  15: 
  16: int main()
  17: {
  18:     int num = 5;
  19:  
  20:     cout << "num = " << num << endl << endl;
  21: 
  22:     cout << "Passing num by value to method ModifyNumberVal() ..." << endl;
  23:     ModifyNumberVal(num);
  24:     cout << "Value of num after exiting the method is " << num << "." << endl << endl;
  25:     
  26:     cout << "Passing num by ref to method ModifyNumberRef() ..." << endl;
  27:     ModifyNumberRef(num);
  28:     cout << "Value of num after exiting the method is " << num << "." << endl;
  29: }
num = 5

Passing num by value to method ModifyNumberVal() ...
Value of number inside method is 15.
Value of num after exiting the method is 5.

Passing num by ref to method ModifyNumberRef() ...
Value of number inside method is 15.
Value of num after exiting the method is 15.

در برنامه بالا دو متد که دارای یک هدف یکسان هستند تعریف شده اند و آن اضافه کردن عدد 10 به مقداری است که به آنها ارسال می شود. اولین متد (خطوط 8-4) دارای یک پارامتر است که نیاز به یک مقدار آرگومان (از نوع int) دارد. وقتی که متد را صدا می زنیم و آرگومانی به آن اختصاص می دهیم (خط 23) ،کپی آرگومان به پارامتر متد ارسال می شود. بنابراین مقدار اصلی متغیر خارج از متد هیچ ارتباطی به پارامتر متد ندارد. سپس مقدار 10 را به متغیر پارامتر(number) اضافه کرده و نتیجه را چاپ می کنیم.
برای اثبات اینکه متغیر num هیچ تغییری نکرده است مقدار آن را یکبار دیگر چاپ کرده و مشاهده می کنیم که تغییر ی نکرده است. دومین متد (خطوط 14-10) نیاز به یک مقدار با ارجاع دارد. در این حالت به جای اینکه یک کپی از مقدار به عنوان آرگومان به ان ارسال شود آدرس متغیر به آن ارسال می شود. حال پارامتر به مقدار اصلی متغیر که زمان فراخوانی متد به آن ارسال می شود دسترسی دارد. وقتی که ما مقدار متغیر پارامتری که شامل آدرس متغیر اصلی است را تغییر می دهیم (خط 12) در واقع مقدار متغیر اصلی در خارج از متد را تغییر داده ایم. در نهایت مقدار اصلی متغیر را وقتی که از متد خارج شدیم را نمایش می دهیم و مشاهده می شود که مقدار آن واقعا تغییر کرده است.