در این آموزش همه چیز در رابطه با توابع را خواهید آموخت مانند انواع توابع و نحوه استفاده از آن ها به همراه مثال.
در برنامه نویسی تابع به یک سری کد خاص اشاره می کند که معمولا در بالای سایر کد ها نوشته می شود و در برنامه با صدا زدن اسم تابع به آن رجوع می شود.
بسته به اینکه توابع توسط برنامه نویس نوشته شده باشند یا از قبل موجود باشند، به دو دسته تقسیم می شوند:
۱- توابع کتابخانه ای
۲- توابع نوشته شده توسط کاربر
توابع کتابخانه ای
این نوع از توابع از قبل ساخته شده هستند. برنامه نویس می تواند با فراخوانی توابع کتابخانه ای از آن ها استفاده کند و احتیاجی به پیاده سازی نیست.
مثال ۱: توابع کتابخانه ای
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double number, squareRoot;
cout << “Enter a number: “;
cin >> number;
// sqrt() is a library function to calculate square root
squareRoot = sqrt(number);
cout << “Square root of ” << number << ” = ” << squareRoot;
return 0;
}
خروجی
Enter a number: 26
Square root of 26 = 5.09902
در مثال بالا تابع sqrt() جذر عدد را حساب می کند.
برای استفاده از توابع ریاضی مانند sqrt() باید کتابخانه آن را به برنامه اضافه کنیم. در کد بالا با دستور #include <cmath> کتابخانه به برنامه اضافه شده است.
با اضافه کردن کتابخانه cmath می توانید از همه ی توابع موجود در آن استفاده کنید بدون اینکه احتیاج باشد آن ها را پیاده سازی کنید.
هر برنامه C++ حداقل یک تابع دارد. تابع اصلی برنامه ها main() است. بدون وجود آن برنامه اجرا نخواهد شد.
توابع تعریف شده توسط کاربر
C++ این امکان را به برنامه نویس می دهد که خودش تابع تعریف کند.
تابع تعریف شده توسط برنامه نویس مجموعه ای از کد هاست که دستور خاصی را انجام می دهند. تابع باید یک نام داشته باشد.
هنگامی که تابع در هر بخشی از برنامه فراخوانی شود، تمام کدهای بدنه تابع اجرا می شوند.
توابع تعریف شده توسط کاربر چگونه در C++ کار می کنند؟
ساختار بالا را در نظر بگیرید.
وقتی برنامه در حال اجراست، سیستم تابع main() را صدا می زند و کد ها از آن جا شروع به اجرا شدن می کنند.
هنگامی که کنترل برنامه به
function_name()
در
main()
برسد، به تابع می رود و کد های درون
function_name()
اجرا می شوند.
سپس کنترل برنامه به () main برمی گردد و کدهای ادامه ی () function_name را اجرا می کند.
مثال ۲ : تابع تعریف شده توسط برنامه نویس
در برنامه زیر دو عدد با هم جمع می شوند که این کار در تابع add() انجام می شود و نتیجه در main نمایش داده می شود.
#include <iostream>
using namespace std;
// Function prototype (declaration)
int add(int, int);
int main()
{
int num1, num2, sum;
cout<<“Enters two numbers to add: “;
cin >> num1 >> num2;
// Function call
sum = add(num1, num2);
cout << “Sum = ” << sum;
return 0;
}
// Function definition
int add(int a, int b)
{
int add;
add = a + b;
// Return statement
return add;
}
خروجی
Enters two integers: 8
-۴
Sum = 4
امضای تابع ( اعلان)
اگر تابع تعریف شده توسط برنامه نویس بعد از تابع main() تعریف شود، کامپایلر خطا می گیرد به این دلیل که کامپایلر از تابع تعریف شده توسط کاربر ، نوع آرگومان انتقال داده شده به تابع و نوع بازگشتی آن آگاه نیست.
در C++ ، امضای تابع بدون body یا بدنه است که وظیفه ی معرفی تابع به کامپایلر را دارد. امضای تابع در مثال فوق برابر است با:
int add(int, int);
می توانید ببینید که هیچ گونه عملکردی در امضای تابع وجود ندارد. فقط نوع بازگشتی و نوع آرگومان های ورودی وجود دارد. همچنین می توانید امضای تابع را به شکل زیر اعلام کنید، اما نوشتن آرگومان ها الزام نیست.
int add(int a, int b);
نکته: اگر تابع قبل از main() تعریف شود احتیاجی به نوشتن امضای تابع نیست.
فراخوانی تابع
برای اجرای کد های بدنه ی تابع، تابع تعریف شده توسط کاربر باید فراخوانی شود (called).
در برنامه بالا
add(num1 , num2) داخل main()
تابع را فراخوانی می کند.
تابع عدد ذخیره شده در add را بازگشت می دهد.
تعریف تابع
تعریف تابع در برنامه بالا به شکل زیر است:
// Function definition
int add(int a,int b)
{
int add;
add = a + b;
return add;
}
هنگامی که تابع فراخوانی می شود، کنترل به اولین دستور بدنه تابع منتقل می شود.
سپس، دستورات دیگر در بدنه تابع به صورت پیوسته اجرا می شوند.
وقتی همه کد ها در تعریف تابع اجرا شدند، کنترل به ادامه برنامه برمی گردد.
ارسال آرگومان به تابع
در برنامه نویسی، آرگومان (پارامتر) به داده هایی اشاره دارد که در هنگام فراخوانی به تابع ارسال می شوند.
در مثال بالا، دو متغیر، num1 و num2 به تابع ارسال می شوند. این آرگومان ها، آرگومان واقعی نامیده می شوند.
مقدار num1 و num2 به ترتیب در متغیر های a و b ذخیره می شوند. این آرگومان ها a و b آرگومان های رسمی نامیده می شوند.
در شکل زیر نشان داده شده است:
نکته های آرگومان ارسالی
- تعداد آرگومان های رسمی و واقعی باید یکسان باشد. (Exception: Overloading Function)
- نوع آرگومان واقعی اول باید با نوع آرگومان رسمی اول یکسان باشد. به طور مشابه، نوع آرگومان واقعی دوم باید با نوع آرگومان رسمی دوم مطابقت داشته باشد و به همین ترتیب.
- شما می توانید تابعی بدون هیچ آرگومان ارسالی بنویسید. تعداد آرگومان های ارسالی به تابع بستگی به این دارد که برنامه نویس چکار می خواهد بکند.
- می توانید مقادیر پیش فرض به آرگومان بدهید. این آرگومان ها به عنوان آرگومان پیش فرض شناخته می شوند.
- در برنامه فوق هر دو آرگومان از نوع int (صحیح) هستند. اما الزامی نیست هر دو آرگومان از یک نوع باشند.
عبارت بازگشت
یک تابع می تواند یک مقدار را به برنامه فراخواننده با استفاده از statement return بازگرداند.
در برنامه بالا، مقدار add از تابع تعریف شده توسط کاربر با استفاده از عبارت زیر به برنامه باز می گردد:
return add;
شکل زیر نحوه کار عبارت بازگشت را نشان می دهد.
در برنامه بالا، مقدار add داخل تابع تعریف شده توسط کاربر به تابع فراخوانی بازگشته است. سپس مقدار آن در sum ذخیره می شود.
توجه داشته باشید که متغیر بازگشتی، یعنی add، از نوع integer (صحیح) است و sum نیز از همان نوع است.
همچنین، توجه کنید که نوع return یک تابع در ابتدای آن
int add (int a int b)
تعریف شده است.
int قبل از
add (int a، int b)
به این معنی است که تابع باید یک مقدار int را برگرداند.
اگر تابع هیچ مقداری بازگشت ندهد، پس باید از void استفاده کرد.