====== آرگومان‌ها و پارامترها ====== ===== ساختار کلی ===== در تعریف تابع **پارامتر** های ورودی (در صورت وجود) به ترتیب به فرمت زیر معرفی میشوند 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<