پارامترها و آرگومان ها

پارامترها داده های خامی هستند که متد آنها را پردازش می کند و سپس اطلاعاتی را که به دنبال آن هستید در اختیار شما قرار می دهد. فرض کنید پارامترها مانند اطلاعاتی هستند که شما به یک کارمند می دهید که بر طبق آنها کارش را به پایان برساند. یک متد می تواند هر تعداد پارامتر داشته باشد. هر پارامتر می تواند از انواع مختلف داده باشد. در زیر یک متد با N پارامتر نشان داده شده است :

returnType MethodName(datatype param1, datatype param2, ... datatype paramN)
{
   code to execute;
}

پارامترها بعد از نام متد و بین پرانتزها قرار می گیرند. بر اساس کاری که متد انجام می دهد می توان تعداد پارامترهای زیادی به متد اضافه کرد. بعد از فراخوانی یک متد باید آرگومانهای آن را نیز تامین کنید. آرگومانها مقادیری هستند که به پارامترها اختصاص داده می شوند. ترتیب ارسال آرگومانها به پارامترها مهم است. عدم رعایت ترتیب در ارسال آرگومانها باعث به وجود آمدن خطای منطقی و خطای زمان اجرا می شود. اجازه بدهید که یک مثال بزنیم :

   1: #include <iostream>
   2: 
   3: using namespace std;
   4: 
   5: int CalculateSum(int number1, int number2)
   6: {
   7:     return number1 + number2;
   8: }
   9: 
  10: int main()
  11: {
  12:     int num1, num2;
  13: 
  14:     cout << "Enter the first number: ";
  15:     cin >> num1;
  16:     cout << "Enter the second number: ";
  17:     cin >> num2;
  18: 
  19:     cout << "Sum = " << CalculateSum(num1, num2);
  20: }
Enter the first number: 10
Enter the second number: 5
Sum = 15

در برنامه بالا یک متد به نام ()CalculateSum (خطوط 8-5) تعریف شده است که وظیفه آن جمع مقدار دو عدد است. چون این متد مقدار دو عدد صحیح را با هم جمع می کند پس نوع برگشتی ما نیز باید int باشد. متد دارای دو پارامتر است که اعداد را به آنها ارسال می کنیم. به نوع داده ای پارامترها توجه کنید. هر دو پارامتر یعنی number1 و number2 مقادیری از نوع اعداد صحیح (int) دریافت می کنند. در بدنه متد دستور return نتیجه جمع دو عدد را بر می گرداند. در داخل متد Main برنامه از کاربر دو مقدار را درخواست می کند و آنها را داخل متغیر ها قرار می دهد. حال متد را که آرگومانهای آن را آماده کرده ایم فراخوانی می کنیم. مقدار num1 به پارامتر اول و مقدار num2 به پارامتر دوم ارسال می شود. حال اگر مکان دو مقدار را هنگام ارسال به متد تغییر دهیم (یعنی مقدار num2 به پارامتر اول و مقدار num1 به پارامتر دوم ارسال شود) هیچ تغییری در نتیجه متد ندارد چون جمع خاصیت جابه جایی دارد.

فقط به یاد داشته باشید که باید ترتیب ارسال آرگومانها هنگام فراخوانی متد دقیقا با ترتیب قرار گیری پارامترها تعریف شده در متد مطابقت داشته باشد. بعد از ارسال مقادیر 10 و 5 به پارامترها ، پارامترها آنها را دریافت می کنند. به این نکته نیز توجه کنید که نام پارامترها طبق قرارداد به شیوه کوهان شتری یا camelCasing (حرف اول دومین کلمه بزرگ نوشته می شود) نوشته می شود. در داخل بدنه متد (خط 7) دو مقدار با هم جمع می شوند و نتیجه به متد فراخوان (متدی که متد ()CalculateSum را فراخوانی می کند) ارسال می شود. در درس آینده از یک متغیر برای ذخیره نتیجه محاسبات استفاده می کنیم ولی در اینجا مشاهده می کنید که میتوان به سادگی نتیجه جمع را نشان داد (خط 7). در داخل متد ()main از ما دو عدد که قرار است با هم جمع شوند درخواست می شود.
در خط 19متد ()CalculateSum را فراخوانی می کنیم و دو مقدار صحیح به آن ارسال می کنیم. دو عدد صحیح در داخل متد با هم جمع شده و نتیجه آنها برگردانده می شود. مقدار برگشت داده شده از متد به وسیله متد cout نمایش داده می شود (خط 19). در برنامه زیر یک متد تعریف شده است که دارای دو پارامتر از دو نوع داده ای مختلف است:

  1: #include <iostream>
  2: #include <string>
  3: using namespace std;
  4: 
  5: void ShowMessageAndNumber(string message, int number)
  6: {
  7:     cout << message << endl;
  8:     cout << "Number = " << number;
  9: }
 10: 
 11: int main()
 12: {
 13:     ShowMessageAndNumber("Hello World!", 100);
 14: }
Hello World!
Number = 100

در مثال بالا یک متدی تعریف شده است که اولین پارامتر آن مقداری از نوع رشته و دومین پارامتر آن مقداری از نوع int دریافت می کند. متد به سادگی دو مقداری که به آن ارسال شده است را نشان می دهد. در خط 13 متد را اول با یک رشته و سپس یک عدد خاص فراخوانی می کنیم . حال اگر متد به صورت زیر فراخوانی می شد :

ShowMessageAndNumber(100, "Welcome to Gimme C++!");

در برنامه خطا به وجود می آمد چون عدد 100 به پارامتری از نوع رشته و رشته Hello World! به پارامتری از نوع اعداد صحیح ارسال می شد.این نشان می دهد که ترتیب ارسال آرگومانها به پارامترها هنگام فراخوانی متد مهم است. به مثال 1 توجه کنید در آن مثال دو عدد از نوع int به پارامترها ارسال کردیم که ترتیب ارسال آنها چون هردو پارامتر از یک نوع بودند مهم نبود. ولی اگر پارامترهای متد دارای اهداف خاصی باشند ترتیب ارسال آرگومانها مهم است.

void ShowPersonStats(int age, int height)
{
    cout << "Age = " << age;
    cout << "Height = " << height;
}

//Using the proper order of arguments
ShowPersonStats(20, 160); 

//Acceptable, but produces odd results
ShowPersonStats(160, 20);

در مثال بالا نشان داده شده است که حتی اگر متد دو آرگومان با یک نوع داده ای قبول کند باز هم بهتر است ترتیب بر اساس تعریف پارامترها رعایت شود. به عنوان مثال در اولین فراخوانی متد بالا اشکالی به چشم نمی آید چون سن شخص 20 و قد او 160 سانتی متر است. اگر آرگومانها را به ترتیب ارسال نکنیم سن شخص 160 و قد او 20 سانتی متر می شود که به واقعیت نزدیک نیست. دانستن مبانی مقادیر برگشتی و ارسال آرگومانها باعث می شود که شما متدهای کارامد تری تعریف کنید. تکه کد زیر نشان می دهد که شما حتی می توانید مقدار برگشتی از یک متد را به عنوان آرگومان به متد دیگر ارسال کنید.

int MyMethod()
{
   return 5;
}

void AnotherMethod(int number)
{
   cout << number;
}

// Codes skipped for demonstration

AnotherMethod(MyMethod());

چون مقدار برگشتی متد ()MyMethod عدد 5 است و به عنوان آرگومان به متد ()AnotherMethod ارسال می شود خروجی کد بالا هم عدد 5 است.