====== آرگومانها و پارامترها ======
===== ساختار کلی =====
در تعریف تابع **پارامتر** های ورودی (در صورت وجود) به ترتیب به فرمت زیر معرفی میشوند
ReturnType myFunction (Type_1 name_1,Type_2 name_2,....,Type_n name_n){ statements }
به عنوان مثال
int myFunction (string name,int age,double grade){ statements }
* توجه کنید که $Type$ میتواند هریک از انواع موجود در $C++$ باشد و حتی میتواند از نوع $pointer$ باشد .
* **آرگومان ها** در واقع مقادیر یا عباراتی هستند که موقع فراخوانی تابع به آن داده میشوند.
* پارامتر های تابع هنگام فراخوانی تابع همانند **متغیری محلی** تولید شده و با توجه به آرگومان ها و **نوع فراخوانی** مقدار میگیرند .
void foo(int x){} // declaration -- x is a parameter
foo(6); // 6 is the argument passed to parameter x
foo(y+1); // the value of y+1 is the argument passed to parameter x
===== آرایه به عنوان پارامتر =====
میتوانیم برای تابع آرایه نیز به عنوان پارامتر بفرستیم ولی در واقع آرایه فرستاده نمیشود بلکه **اشاره گر** به اولین خانه آن فرستاده میشود (زیرا فرستادن کل آرایه کار بهینه ای نیست ).
int myFunction(int* param ){ statements }
int myFunction(int param[]){ statements }
دو تعریف بالا مانند یکدیگر عمل میکنند معمولا نیاز است تا اندازه آرایه را نیز به عنوان پارامتری دیگر بفرستیم.
int myFunction(int param[],int size){ statements }
اگر آرایه چند بعدی باشد لازم است تا اندازه بعد های **دوم به بعد** را در تعریف مشخص کنیم (مشخص کردن اندازه بعد اول تاثیری ندارد).
int myFunction(int Info[][100][20]){ statements }
===== ارسال آرگومان =====
در $C++$ سه روش برای ارسال آرگومان به تابع وجود دارد که هرکدام را به طور مجزا توضیح می دهیم.
==== ارسال آرگومان با مقدار $Value$ $By$ $Argument$ $Passing$ ====
این روش در واقع روش پیشفرض در $C++$ است . در این روش مقدار آرگومان داده شده محاسبه شده و برای تابع فرستاده میشود و در پارامتر مربوطه که همچون متغیری محلی است ذخیره میشود. چون این پارامتر تنها یک کپی از آرگومان است با تغییر آن در تابع مقدار واقعی آرگومان تغییر نمیکند.
#include
using namespace std;
int add(int a,int b){
a=a+b;
return a;
}
int main()
{
cout<
==== ارسال آرگومان با ارجاع $Refrence$ $By$ $Argument$ $Passing$ ====
در این حالت پارامتر مورد نظر یک $refrence$ از آرگومان داده شده به تابع میشود و آرگومان مورد نظر باید حتما یک متغیر باشد و دیگر نمیتواند برای مثال مقداری ثابت یا یک عبارت محاسباتی باشد. در تعریف پارامتر باید آن را به شکل یک $refrence$ تعریف کنیم.
int myFunction(Type& name){ statements }
برای مثال یک تابع مینویسیم که دو متغیر را $swap$ کند.
#include
using namespace std;
void badSwap(int a,int b){
int c=a;
a=b;
b=c;
}
void goodSwap(int& a,int& b){
int c=a;
a=b;
b=c;
}
int main()
{
int a=1,b=2;
badSwap(a,b);
cout<
==== ارسال آرگومان با آدرس $Adress$ $By$ $Argument$ $Passing$ ====
در این حالت پارامتر ورودی از نوع آدرسی یا $pointer$ است و در نتیجه یک آدرس برای تابع فرستاده میشود و در اشاره گر مورد نظر ذخیره میشود. در این حالت چون آدرس را داریم میتوانیم به محتوای موجود در آدرس دسترسی داشته باشیم و در صورت نیاز آن را تغییر دهیم این حالت را میتوان گفت در واقع حالتی خاص از **ارسال آرگومان با مقدار** است.
#include
using namespace std;
void badSwap(int a,int b){
int c=a;
a=b;
b=c;
}
void goodSwap(int& a,int& b){
int c=a;
a=b;
b=c;
}
void pointerSwap(int* a,int* b){
int c=(*a);
(*a)=(*b);
(*b)=c;
}
int main()
{
int a=1,b=2;
badSwap(a,b);
cout<